![](/img/trans.png)
[英]MVC Razor 5: Model is passed as null to the controller from a view
[英]Model Data passed from View to Controller is 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>£ @Html.EditorFor(modelItem => item.ItemPrice)</td>
</tr>
}
<input type="submit" value="Save Items" />
当我将数据发布回控制器时,exhibitionitemmodel为null:
[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; }
}
}
有关模型数据为空的任何想法?
确保在模型中使用的每个类上都有一个公共无参数构造函数,包括它们使用的枚举和类。
另外,在构造函数中实例化包含的类。 模型绑定器需要填充对象的实例。示例如下。 对模型使用的所有类执行此操作。
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循环迭代您的项目。 这样,视图将生成包含模型绑定器可以理解的索引的名称。
为了通过模型绑定让自己更轻松,我建议为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> @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
参数添加到接收post的action方法,并在调试期间检查此参数。 这有助于查看从表单中发布的数据,并从那里可以找出在模型绑定期间未绑定的原因。
您的CSHTML
是否有任何形式可以使用本文您必须使用此代码
@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>£ @Html.EditorFor(modelItem => item.ItemPrice)</td>
</tr>
}
<input type="submit" value="Save Items" />}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.