i trying keep dropdownlist selected value if modelstate not valid
because want keep data user selected if modelstate not valid
my code looks this
get method:
[httpget] public actionresult edit(int? id) { using (var db = new newsdatabaseentities()) { db.configuration.lazyloadingenabled = false; var result = (from n in db.news.include("categories") c in db.categories n.newsid == id select new { news = n, newecategories = n.categories, cate = c }).tolist(); news newsdetails = (from news in result select new news { newsid = news.news.newsid, newstitle = news.news.newstitle, newsbody = news.news.newsbody, newsimagepath = news.news.newsimagepath, categories = news.newecategories }).firstordefault(); var allcategories = (from c in result select new category { categoryid = c.cate.categoryid, categoryname = c.cate.categoryname }).tolist(); if (newsdetails != null) { var model = new newsviewmodel(); model.newsid = newsdetails.newsid; model.allcategories = allcategories; model.categories = newsdetails.categories; model.newstitle = newsdetails.newstitle; model.newsbody = newsdetails.newsbody; model.newsimagepath = newsdetails.newsimagepath; session["allcategories"] = new multiselectlist(allcategories, "categoryid", "categoryname", model.categories.select(j => j.categoryid).toarray()); session["model"] = model; return view(model); } else { return redirecttoaction("index", "home"); } } return view(); }
post method:
[httppost] [validateinput(false)] public actionresult edit(newsviewmodel model,formcollection col) { if (!modelstate.isvalid) { model = (newsviewmodel)session["model"]; return view(model); }
view:
@html.dropdownlistfor(c => c.selectedcategoriesids, (multiselectlist)session["allcategories"], new { id = "dropdownlist1", multiple = "multiple", @class = "form-control" })
because overwriting view model object(which has selected option value) session data set in action.
you should read selected option value temp variable , use that.
[httppost] [validateinput(false)] public actionresult edit(newsviewmodel model,formcollection col) { if (!modelstate.isvalid) { var selected= model.selectedcategoriesids; model = (newsviewmodel)session["model"]; model.selectedcategoriesids =selected; return view(model); } //save , return something**strong text** }
a better solution not not use session here. may read values again db table/or cache. rendering dropdown, may add property view model , use that.
public class newsviewmodel { public list<selectlistitem> allcategories {set;get;} //other properties }
and in action, instead of setting categories session, set property
public actionresult edit(int? id) { var vm = new newsviewmodel(); vm.allcategories = getcategories(); return view(vm); } private ienumerable<selectlistitem> getcategories() { return db.categories .select(s=>new selectlistitem { value=s.id.tostring(), text=s.name).tolist(); }
and in view
@model newsviewmodel @using(html.beginform()) { <label> select items <label> @html.listboxfor(s=>s.selectedcategoriesids,allcategories ) <input type="submit" /> }
now in httppost action, when model validation fails, not need use session, call same method re-load allcategories
property.
if (!modelstate.isvalid) { model.allcategories=getcategories(); return view(model); }
Comments
Post a Comment