0

我有一个复杂的类,它是视图模型属性的一部分。我的视图模型有一个酒类属性,一个酒类有一个名为 CaseProductions 的 ICollection 属性。CaseProduction 类也有几个属性。

在 create GET 事件中,NewWineViewModel 被实例化,然后它运行 GetCaseProductionDefaults 并创建具有一些默认值但大部分为空的 CaseProduction 类的列表。

现在,我最初使用 razor 来执行 foreach 语句,然后按照我想要的方式弹出我的表格。但是我发现将这种类型的 IEnumerable 绑定回 POST 上的视图模型不起作用。我试过使用下面的,但没有骰子。

EditorFor(m => m.Wine.CaseProductions)

我真的在寻找有关处理此问题的最佳方法的建议。每款酒都会有一系列案例制作,我希望将其绑定回视图模型中的酒。他们是否可以通过某种方式在 razor 中编辑这些元素的 id 以确保它们绑定?处理这个问题的最佳方法是什么?

视图模型:

    public class NewWineViewModel
    {

        public Wine Wine { get; set; }
        public VOAVIRequest VOAVIRequest { get; set; }
        public bool IsRequest { get; set; }

        public Dictionary<int, int> BottlesPerCase { get; set; }
        public SelectList VarTypes { get; set; }
        public SelectList Origins { get; set; }
        public SelectList Apps { get; set; }
        public SelectList Vintages { get; set; }
        public SelectList Importers { get; set; }
}

案例制作类:

public class CaseProduction
{
    public int CaseProductionID { get; set; }
    public int WineID { get; set; }
    public int CaseProductionSizeID { get; set; }
    public int CaseCount { get; set; }
    public int CountPerCase { get; set; }

    public virtual CaseProductionSize CaseProductionSize { get; set; }
    public virtual Wine Wine { get; set; }

}

获取默认案例制作:

public List<CaseProduction> GetCaseProductionDefaults(vfContext db)
{
    //creates blank list of all formats
    List<CaseProduction> cp = new List<CaseProduction>();
    foreach (CaseProductionSize size in db.CaseProductionSizes)
    {
        int defaultBottlesPerCase = 1;
        switch ((CaseProductionSizeEnum)size.CaseProductionSizeID)
        {
            case CaseProductionSizeEnum.s187ml:
                defaultBottlesPerCase= 24;
                break;
            case CaseProductionSizeEnum.s375ml:
                defaultBottlesPerCase = 12;
                break;
            case CaseProductionSizeEnum.s500ml:
                defaultBottlesPerCase = 12;
                break;
            case CaseProductionSizeEnum.s750ml:
                defaultBottlesPerCase = 12;
                break;
            default:
                defaultBottlesPerCase = 1;
                break;
        }

        cp.Add(new CaseProduction { CaseProductionSizeID = size.CaseProductionSizeID, CountPerCase = defaultBottlesPerCase, CaseProductionSize = size, WineID = this.Wine.WineID });
    }
    return cp;
}

我的案例生产表的剃须刀代码:

  @foreach (vf2.Models.CaseProduction cp in Model.Wine.CaseProductions)
            {
                <tr>
                    <td>@cp.CaseProductionSize.Name
                    </td>
                    <td>@Html.Raw(@Html.TextBoxFor(m => m.Wine.CaseProductions.Where(c => c.CaseProductionSizeID == cp.CaseProductionSizeID).First().CaseCount, new { @class = "caseCount", id = "txt" + cp.CaseProductionSize.Name }).ToString().Replace("CaseCount","txt" + cp.CaseProductionSize.Name))
                    </td>
                    <td>
                        @Html.DropDownListFor(m => m.Wine.CaseProductions.Where(c => c.CaseProductionSizeID == cp.CaseProductionSizeID).First().CountPerCase, new SelectList(Model.BottlesPerCase, "Key", "Value", cp.CountPerCase), new { @class = "countPerCase", id = "ddl" + cp.CaseProductionSize.Name, name = "ddl" + cp.CaseProductionSize.Name})
                    </td>
                    <td class="totalBottleCalc">
                    </td>
                </tr>
 }

我的 caseproduction 集合的实例化:

 public ActionResult Create(int ID = 0, int VintUpID = 0)
        {
            NewWineViewModel nw = new NewWineViewModel();

            nw.Wine.CaseProductions = nw.GetCaseProductionDefaults(db);
            nw.BottlesPerCase = nw.GetBottlesPerCase(db);
4

2 回答 2

0

您必须在父模型构造函数中实例化嵌套列表和复杂模型。默认模型绑定器不会实例化子类。

如果您这样做,那么您可以使用 EditorFor(m => m.Wine.CaseProductions) 应该可以工作,并且您不需要正在使用的复杂视图代码。

如果您想自定义 CaseProduction 的呈现方式,则可以在 ~/Shared/EditorTemplates 中创建一个 CaseProduction.cshtml 文件,它将使用此定义来呈现集合中的每个项目(它会自动为您遍历集合) .

此外,您不应在视图中执行 linq 查询。您的问题是看起来您将数据实体直接传递给视图。这是一个糟糕的设计。您需要创建一个仅包含渲染视图所需信息的 ViewModel。然后,在将数据分配给 View 模型之前过滤数据。

于 2012-09-28T18:52:08.467 回答
0

我相信模型活页夹不会拾取您的CaseProduction对象,因为它们看起来不像CaseProduction对象。

您已重命名CaseCount,您CaseProductionSize没有 Id(也没有CaseProduction,并且它缺少几个属性。在您的循环中,您必须包含所有属性,并保持名称与您的 POCO 的名称一致。否则模型绑定器将不知道什么它们是。如果需要,您可以将所有属性放在隐藏字段中。

于 2012-09-28T19:04:44.750 回答