2013-02-18 187 views
0

我有一個正在從模型正確填充的視圖。這裏是觀的切開術:從視圖傳遞給控制器​​的模型數據爲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

表單標籤在哪裏? – 2013-02-18 16:51:40

+0

好抓@YuriyRozhovetskiy – 2013-02-18 16:52:13

回答

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 2013-02-18 22:03:48

+0

爲您的視圖添加ID的隱藏字段,以及您想提交的非常其他數據。您只會獲得表單中存在的值。 – gabnaim 2013-02-18 22:11:59

1

爲了讓模型綁定自己更容易,我想 建議爲您的ItemWrapper類製作EditorTemplate。

// 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" /> 
} 

Items集合上使用EditorFor將呈現格式的HTML 時 綁定到一個列表,默認粘合劑期待。你可以使用 索引和for循環手動呈現html,如果你想更好地控制它, ,但這種方式爲你照顧它。

而作爲一般的提示,我覺得在這些情況下非常有用, 添加FormCollection參數是 接收後的操作方法,並在 調試檢查此參數。這有助於查看哪些數據從表單中獲得 ,並從那裏可以找出爲什麼 在模型綁定過程中未被綁定。

相關問題