c# - Mvc how to keep dropdownlist selected value if ModelState is not valid -


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