C# 从视图传递到控制器的模型数据为空

C# 从视图传递到控制器的模型数据为空,c#,asp.net-mvc-3,linq,C#,Asp.net Mvc 3,Linq,我有一个从模型中正确填充的视图。以下是视图的缩图: @model PickardOrdering.Models.ExhibitionItemModel @foreach (var item in Model.Items) { <tr> <td>@Html.DisplayFor(modelItem => item.Code)</td> <td>@Html.DisplayF

我有一个从模型中正确填充的视图。以下是视图的缩图:

@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" />
@model PickardOrdering.Models.emmodel
@foreach(Model.Items中的var项)
{
@DisplayFor(modeleItem=>item.Code)
@DisplayFor(modelItem=>item.Description)
@CheckBoxFor(modelItem=>item.AdditionalItem.Value,新的{@disabled=“disabled”})
@CheckBoxFor(modelItem=>item.IsItemSelected.Value)
@Html.EditorFor(modelItem=>item.ItemPrice)
}
当我将数据发回控制器时,ExamplOnItemModel为空:

[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;
[HttpPost,ActionName(“CreateExamplionItems”)]
公共行动结果CreateExhiponItems(ExhiponeModel ExhiponeModel)
{
十进制价格;
if(ModelState.IsValid)
{
List LSTONITEM=新列表();
IEnumerable lstItemWrapper=来自exhibitionitemmodel.Items中的objExhibitionItemModel
选择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; }
    }    
}
namespace PickardOrdering.Models
{
公共类ItemWrapper:tblItem
{
公共十进制ItemPrice{get;set;}
公共布尔?IsItemSelected{get;set;}
}
公共类展览模型
{   
公共IEnumerable项{get;set;}
公共tblExhibition展览{get;set;}
公共IEnumerable对象{get;set;}
}    
}

你知道为什么模型数据是空的吗?

在你的
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>£&nbsp;@Html.EditorFor(modelItem => item.ItemPrice)</td>
        </tr>
    }

<input type="submit" value="Save Items" />}
@使用(Html.BeginForm(“createExpansionItems”、“controllerName”、FormMethod.Post))
{@foreach(Model.Items中的变量项)
{
@DisplayFor(modeleItem=>item.Code)
@DisplayFor(modelItem=>item.Description)
@CheckBoxFor(modelItem=>item.AdditionalItem.Value,新的{@disabled=“disabled”})
@CheckBoxFor(modelItem=>item.IsItemSelected.Value)
@Html.EditorFor(modelItem=>item.ItemPrice)
}
}

确保在模型中使用的每个类上都有一个公共的无参数构造函数,包括可枚举项和它们使用的类

此外,在构造函数中实例化包含的类。模型绑定器将需要填充对象的实例。示例如下。对模型使用的所有类执行此操作

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; }
}    
公共类模型
{   
公共模型(){
展览=新的tblExhibition();
ems=新列表();
项目=新列表();
}
公共IEnumerable项{get;set;}
公共tblExhibition展览{get;set;}
公共IEnumerable对象{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>&nbsp;@Html.EditorFor(m => m.ItemPrice)</td>
</tr>
//视图//编辑模板/ItemWrapper.cshtml
@模型PickardOrdering.Models.ItemWrapper
@DisplayFor(m=>m.Code)
@DisplayFor(m=>m.Description)
@CheckBoxFor(m=>m.AdditionalItem.Value,新的{@disabled=“disabled”})
@CheckBoxFor(m=>m.IsItemSelected.Value)
@EditorFor(m=>m.ItemPrice)
您的main.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" />
}
@model PickardOrdering.Models.emmodel
@使用(Html.BeginForm(“createExportionItems”、“Home”、FormMethod.Post))
{  
@EditorFor(m=>m.Items)
}
项目
集合使用编辑器for将呈现 使用默认活页夹在 绑定到列表。您可以使用 一个索引和一个for循环如果你想更好地控制它, 但这种方式可以帮你解决问题

作为一个我认为在这种情况下有用的一般提示, 将
FormCollection
参数添加到操作方法 接收post,并在发送过程中检查此参数 调试。这有助于查看正在发布的数据 从表格中,你可以找出原因
在模型绑定期间未绑定。

good catch@yuriyrozhovetskii已经做了这些更改,现在看起来好多了。但是,当我将视图中的数据传递回控制器时,我得到了IsItemSelected和ItemPrice的正确值,但其他所有值都为null。例如,我原始po中的ExhibonItemModel.Items.IDst设置为0,就好像没有填充一样。为视图中的ID以及要提交的其他数据段添加一个隐藏字段。您将只获取表单中存在的值。