2015-11-11 4 views
1

У меня есть ViewModel, который содержит список SelectListItems, называемых типами. Когда я перехожу на страницу редактирования, типы заполняются, а раскрывающийся список содержит элементы, как ожидалось. Когда я публикую изменения, список SelectListItems имеет значение null. т. е. «model.Types» имеет значение NULL.MVC ViewModel collection null on postback

Почему это и как его исправить?

Я видел этот вопрос несколько раз, но у всех есть разные ответы, и я пробовал несколько, и они не работают.

Я новичок в MVC, поэтому, пожалуйста, помогите.

Благодаря

Мои ViewModel:

public class StaticItemViewModel 
{ 
    public Static_Item StaticItem { get; set; } 
    public List<SelectListItem> Types { get; set; }  
} 

Мой контроллер:

public class StaticItemController : Controller 
{ 
    private DB db = new DB(); 

    public ActionResult Edit(int id) 
    {    
     Static_Item staticItem = db.Static_Item.Find(id); 

     if (staticItem == null) 
     { 
      return HttpNotFound(); 
     } 

     StaticItemViewModel staticItemViewModel = new StaticItemViewModel() 
     { 
      StaticItem = staticItem, 
      Types = LoadStaticItemTypes(staticItem.Type) 
     }; 

     return View(staticItemViewModel); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit([Bind(Include="StaticItem")] StaticItemViewModel model)      
    { 
     if (ModelState.IsValid) 
     { 
      model.StaticItem.Changed_Date = DateTime.Now; 
      db.Entry(model.StaticItem).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(model); 
    } 

    List<SelectListItem> LoadStaticItemTypes(string selectedType = "") 
    { 
     List<SelectListItem> items = new List<SelectListItem>(); 

     foreach (var item in db.Static_Item.Select(s => s.Type).Distinct().OrderBy(s => s)) 
     { 
      items.Add(new SelectListItem { Text = item, Value = item, Selected = item == selectedType }); 
     } 

     return items; 
    } 
} 

Мой Вид:

@model StaticItemViewModel 

@{ 
    ViewBag.Title = "Edit"; 
} 

<h2>Edit</h2> 

@using (Html.BeginForm()) 
    { 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>@Model.StaticItem.Description</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     @Html.HiddenFor(model => model.StaticItem.UN_Static_Item) 

     <div class="form-group"> 
      @Html.LabelFor(model => model.StaticItem.Description, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.StaticItem.Description, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.StaticItem.Description, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.StaticItem.Type, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DropDownListFor(model => model.StaticItem.Type, Model.Types, new { @class="form-control" }) 
       @Html.ValidationMessageFor(model => model.StaticItem.Type, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Save" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

ответ

4

Это потому, что Types просто держит список неавтоматического ионов, а сами фактические параметры никогда не будут отправлены назад. Вам нужна недвижимость как:

public List<int> SelectedTypes { get; set; } 

А затем связать к тому, что на ваш взгляд:

@Html.ListBoxFor(m => m.SelectedTypes, Model.Types) 

Это предполагает, что ваши значения параметров только ПК типа, вы могли бы так же хорошо связываются с List<string>, и т. д., но он должен быть примитивным типом (строка, int и т. д.). Вы не можете публиковать сообщения полностью Type объектов. Если вам это нужно, вам нужно будет использовать список идентификаторов и т. Д., Чтобы искать их из базы данных.

+0

Спасибо за ответ Вы хотите сказать, что коллекция SelectedTypes должна быть заполнена в запросе Get для страницы редактирования? Коллекции Type все равно будут Null в edit postback, так что мне тоже придется их переполнять? – Sun

+1

Да. «Типы» должны быть просто всевозможными типами, вам не нужно указывать какие-либо данные о том, выбран ли он в данный момент или нет; Бритва позаботится об этом. Затем «SelectedTypes» следует установить с выбранными в данный момент типами, если они есть, перед возвратом представления. И да, вы всегда * должны повторно заполнять элементы выбранного списка. Они всегда будут пустыми после публикации. –

+0

Спасибо. Сейчас у меня все работает. – Sun