Dropdownlist post in ASP.NET MVC3 and Entity Framework Model

Posted by Josh Blade on Stack Overflow See other posts from Stack Overflow or by Josh Blade
Published on 2012-06-24T15:14:44Z Indexed on 2012/06/24 15:15 UTC
Read the original article Hit count: 297

Filed under:
|
|

I have 3 tables:

RateProfile

  • RateProfileID
  • ProfileName

Rate

  • RateID
  • RateProfileID
  • PanelID
  • Other stuff to update

Panel

  • PanelID
  • PanelName

I have models for each of these. I have an edit page using the RateProfile model. I display the information for RateProfile and also all of the Rates associated with it. This works fine and I can update it fine. However, I also added a dropdown so that I can filter Rates by PanelID. I need it to post back on change so that it can display the filtered rates.

I'm using

@Html.DropDownList("PanelID", (SelectList)ViewData["PanelDropDown"], new { onchange = "$('#RateForm').submit()" })

for my dropdownlist. Whenever it posts back to my HttpPost Edit method though, it seems to be missing all information about the Rates navigation property. It's weird because I thought it would do exactly what the input/submit button that I have in the form does (which actually passes the entire model back to my HttpPost Edit action and does what I want it to do). The panelID is properly being passed to my HttpPost Edit method and on to the next view, but when I try to query the Model.Rates navigation property is null (only when the post comes from the dropdown. Everything works fine when the post comes from my submit input).

Get Edit:

    public ActionResult Edit(int id, int panelID = 1)
    {

        RateProfile rateprofile = db.RateProfiles.Single(r => r.RateProfileID == id);
        var panels = db.Panels;

        ViewData["PanelDropDown"] = new SelectList(panels, "PanelID", "PanelName", panelID);
        ViewBag.PanelID = panelID;

        return View(rateprofile);
    }

HttpPost Edit:

    [HttpPost]
    public ActionResult Edit(RateProfile rateprofile, int panelID)
    {
        var panels = db.Panels;
        ViewData["PanelDropDown"] = new SelectList(panels, "PanelID", "PanelName", panelID);
        ViewBag.PanelID = panelID;
        if (ModelState.IsValid)
        {
            db.Entry(rateprofile).State = EntityState.Modified;

            foreach (Rate dimerate in rateprofile.Rates)
            {
                db.Entry(dimerate).State = EntityState.Modified;
            }
            db.SaveChanges();
            return View(rateprofile);
        }
        return View(rateprofile);
    }

View:

@model  PDR.Models.RateProfile
@using (Html.BeginForm(null,null,FormMethod.Post, new {id="RateForm"}))
{
    <div>
        @Html.Label("Panel")
        @Html.DropDownList("PanelID", (SelectList)ViewData["PanelDropDown"], new { onchange = "$('#RateForm').submit()" })
    </div>
    @{var rates= Model.Rates.Where(a => a.PanelID == ViewBag.PanelID).OrderBy(a => a.minCount).ToList();}
    @for (int i = 0; i < rates.Count; i++)
        {
            <tr>
                <td>
                    @Html.HiddenFor(modelItem => rates[i].RateProfileID)
                    @Html.HiddenFor(modelItem => rates[i].RateID)
                    @Html.HiddenFor(modelItem => rates[i].PanelID)

                    @Html.EditorFor(modelItem => rates[i].minCount)
                    @Html.ValidationMessageFor(model => rates[i].minCount)
                </td>
                <td>
                    @Html.EditorFor(modelItem => rates[i].maxCount)
                    @Html.ValidationMessageFor(model => rates[i].maxCount)
                </td>
                <td>
                    @Html.EditorFor(modelItem => rates[i].Amount)
                    @Html.ValidationMessageFor(model => rates[i].Amount)
                </td>
            </tr>
        }
     <input type="submit" value="Save" />
}

To summarize my problem, the below query in my view only works when the post comes from the submit button and not when it comes from my dropdownlist.

@{var rates= Model.Rates.Where(a => a.PanelID == ViewBag.PanelID).OrderBy(a => a.minCount).ToList();}

© Stack Overflow or respective owner

Related posts about asp.net-mvc

Related posts about asp.net-mvc-3