0

我有一个从模型正确填充的视图。这是视图的缩减:

@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; }
    }    
}

任何想法为什么模型数据为空?

4

3 回答 3

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 循环来迭代您的项目。这样视图将生成包含模型绑定器可以理解的索引的名称。

于 2013-02-18T17:25:31.187 回答
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" />
}

在您的集合上使用 EditorForItems将以默认绑定器在绑定到列表时所期望的格式呈现 html。如果您想要更好地控制它,您可以使用索引和 for 循环手动呈现 html,但这种方式会为您处理它。

作为我发现在这些情况下有用的一般提示,将FormCollection参数添加到接收帖子的操作方法中,并在调试期间检查此参数。这有助于查看从表单中发布了哪些数据,并且从那里您可以找出在模型绑定期间它没有被绑定的原因。

于 2013-02-18T18:13:42.330 回答
0

你有什么表格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" />}
于 2013-02-18T17:13:46.717 回答