Sunday, 15 February 2015

asp.net - Html.DropDownListFor selecting item based on ModelState rather than Model -



asp.net - Html.DropDownListFor selecting item based on ModelState rather than Model -

in asp.net mvc (v5 in case), when post model controller, , render view with model other 1 posted back, html.dropdownlistfor select selected item based on info model posted back, rather model passed view.

why this?

here's example. when select new item in first dropdown, form posts back, , if fist dropdown has id=2 selected, selectedid2 changed , sec dropdown should render sec item selected. that's not case. while model object in view does have new selectedid2 = 2 value, dropdownlistfor under hood gets selected value viewstate.modelstate object, not viewstate.model. can done dropdownlistfor render based on model passed view?

the controller:

public class homecontroller : controller { public actionresult index() { var defaultmodel = getmodel(); homecoming view(defaultmodel); } [httppost] public actionresult index(model1 postedmodel) { var defaultmodel = getmodel(); if (postedmodel.selectedid1 == 2) { defaultmodel.selectedid1 = 2; defaultmodel.selectedid2 = 2; } homecoming view(defaultmodel); } private model1 getmodel() { var items1 = new[] { new { name = "item 1-1", id = "1" }, new { name = "item 1-2", id = "2" } }; var items2 = new[] { new { name = "item 1-1", id = "1" }, new { name = "item 2-2", id = "2" } }; homecoming new model1 { selectedid1 = 1, selectedid2 = 1, selectlist1 = new selectlist(items1, "id", "name", 1), selectlist2 = new selectlist(items2, "id", "name", 1) }; } }

the view model:

public class model1 { public selectlist selectlist1 { get; set; } public selectlist selectlist2 { get; set; } public int selectedid1 { get; set; } public int selectedid2 { get; set; } }

the view:

@model model1 @using (html.beginform(formmethod.post)) { <div> @html.dropdownlistfor(m => m.selectedid1, model.selectlist1, new { title = "select 1", onchange = "this.form.submit();" }) @html.dropdownlistfor(m => m.selectedid2, model.selectlist2, new { title = "select 2", onchange = "this.form.submit();" }) </div> }

edit: one solution found: adding line before executing view() clears out posted model dropdownlistfor helper uses model passed view:

viewdata.modelstate.clear();

you can specify selected value if utilize appropriate selectlist constructor:

selectlist constructor (ienumerable, string, string, object)

the lastly parameter selected item, must 1 object of ienumerable.

you using constructor, specifying 1 value. should items1[0]

asp.net asp.net-mvc asp.net-mvc-5

No comments:

Post a Comment