2013-02-18 2 views
0

У меня есть представление, которое правильно заполняется с модели. Вот урезывание представления:Данные модели, переданные от View to Controller, равны NULL

@model PickardOrdering.Models.ExhibitionItemModel 

@foreach (var item in Model.Items) 
    { 
     <tr> 
      <td>@Html.DisplayFor(modelItem => item.Code)</td> 
      <td>@Html.DisplayFor(modelItem => item.Description)</td> 
      <td>@Html.CheckBoxFor(modelItem => item.AdditionalItem.Value, new { @disabled = "disabled" })</td> 
      <td>@Html.CheckBoxFor(modelItem => item.IsItemSelected.Value)</td> 
      <td>£&nbsp;@Html.EditorFor(modelItem => item.ItemPrice)</td> 
     </tr> 
    } 

<input type="submit" value="Save Items" /> 

Когда я отправляю данные обратно в контроллер, exhibitionitemmodel равно нулю:

[HttpPost, ActionName("CreateExhibitionItems")] 
    public ActionResult CreateExhibitionItems(ExhibitionItemModel exhibitionitemmodel) 
    { 
     decimal decPrice; 
     if (ModelState.IsValid) 
     { 
      List<tblExhibitionItem> lstExhibitionItem = new List<tblExhibitionItem>(); 
      IEnumerable<ItemWrapper> lstItemWrapper = from objExhibitionItemModel in exhibitionitemmodel.Items 
                               select objExhibitionItemModel; 

Вот класс модели используется:

namespace PickardOrdering.Models 
{ 
    public class ItemWrapper : tblItem 
    { 
     public decimal ItemPrice { get; set; } 
     public bool? IsItemSelected { get; set; } 
    } 

    public class ExhibitionItemModel 
    { 
     public IEnumerable<ItemWrapper> Items { get; set; } 
     public tblExhibition Exhibition { get; set; } 
     public IEnumerable<tblExhibitionItem> ExhibitionItems { get; set; } 
    }  
} 

Любые идеи, почему данные модели равны нулю?

+2

Где находится тег формы? –

+0

good catch @YuriyRozhovetskiy –

ответ

0

Есть ли какая-либо форма в вашем CSHTML вы можете использовать этот article Вы должны использовать этот код

@using (Html.BeginForm("CreateExhibitionItems", "controllerName", FormMethod.Post)) 
{ @foreach (var item in Model.Items) 
    { 
     <tr> 
      <td>@Html.DisplayFor(modelItem => item.Code)</td> 
      <td>@Html.DisplayFor(modelItem => item.Description)</td> 
      <td>@Html.CheckBoxFor(modelItem => item.AdditionalItem.Value, new { @disabled = "disabled" })</td> 
      <td>@Html.CheckBoxFor(modelItem => item.IsItemSelected.Value)</td> 
      <td>£&nbsp;@Html.EditorFor(modelItem => item.ItemPrice)</td> 
     </tr> 
    } 

<input type="submit" value="Save Items" />} 
1

Убедитесь, что открытый конструктор без параметров на каждый классе вы используете в вашей модели, включая перечислимые и классы, используемые ими.

Также создайте экземпляр включенных классов в конструктор. Модельному связующему будет нужен экземпляр объектов для заполнения. Пример приведен ниже. Сделайте это для всех классов, используемых вашей моделью.

public class ExhibitionItemModel 
{ 

    public ExhibitionItemModel(){ 
     Exhibition = new tblExhibition(); 
     ExhibitionItems = new List<tblExhibitonItem>(); 
     Items = new List<ItemWrapper>(); 
    } 

    public IEnumerable<ItemWrapper> Items { get; set; } 
    public tblExhibition Exhibition { get; set; } 
    public IEnumerable<tblExhibitionItem> ExhibitionItems { get; set; } 
}  

Также, на ваш взгляд, повторяйте свои позиции с помощью индекса, а не цикла foreach. Это значит, что представление будет сгенерировано с именами, содержащими индексы, которые может понять связующее устройство.

+0

Я внес эти изменения, и теперь это выглядит намного лучше. Однако, когда я передаю данные из представления обратно контроллеру, я получаю правильные значения для IsItemSelected и ItemPrice, но все остальное равно null. Например, exhibitionitemmodel.Items.ID из моего исходного сообщения установлен в 0, как будто он не заполняется. – superman1971

+0

Добавьте скрытое поле для идентификатора к вашему виду и для очень другой части данных, которую вы хотите отправить. Вы получите только значения, которые присутствуют в форме. – gabnaim

1

Чтобы сделать жизнь легкой на себе с привязкой к модели, я бы предложил сделать шаблон EditorTemplate для вашего класса ItemWrapper.

// Views/<WhateverYourControllerIsCalled>/EditorTemplates/ItemWrapper.cshtml 

@model PickardOrdering.Models.ItemWrapper 

<tr> 
     <td>@Html.DisplayFor(m => m.Code)</td> 
     <td>@Html.DisplayFor(m => m.Description)</td> 
     <td>@Html.CheckBoxFor(m => m.AdditionalItem.Value, new { @disabled = "disabled" })</td> 
     <td>@Html.CheckBoxFor(m => m.IsItemSelected.Value)</td> 
     <td>&nbsp;@Html.EditorFor(m => m.ItemPrice)</td> 
</tr> 

И ваш главный .cshtml становится:

@model PickardOrdering.Models.ExhibitionItemModel 

@using (Html.BeginForm("CreateExhibitionItems", "Home", FormMethod.Post)) 
{ 
    <table> 
    @Html.EditorFor(m => m.Items) 
    </table> 
    <input type="submit" value="Save Items" /> 
} 

Использование EditorFor на вашем Items коллекции будет оказывать HTML в формате, связующий по умолчанию ожидает, когда привязки к списку. Вы можете отобразить html вручную, используя индекс и цикл for, если вы хотите более тонкий контроль над ним, , но этот способ позаботится об этом для вас.

И как общий совет, который я нахожу полезным в таких ситуациях, добавить параметр FormCollection в метод действия, который получения должности, и проверить этот параметр во время отладки. Это помогает узнать, какие данные отправляются из формы, и оттуда вы можете понять, почему он не связан с привязкой к модели.

Смежные вопросы