部分视图中的数据为NULL

时间:2014-02-09 01:40:01

标签: c# asp.net-mvc

我有一个部分观点:

@model BasicFinanceUI.Models.TransactionLine

<div class="form-group">
    <label for="cmbCategory0" class="col-lg-1 control-label">Category:</label>
    <div class="col-lg-3">
        @Html.DropDownListFor(x => x.CategoryId,
                                   new SelectList(Model.References.Categories, "Value", "Text", Model.CategoryId), "Select one",
                                   new { @onchange = "populateSubCategory(0)", @class = "cmbCategory form-control" })
    </div>
</div>

此部分视图从List&lt;&gt;加载我主视图中的对象:

@foreach (var line in Model.Transaction.TransactionLines)
{
    @Html.Partial("_TransactionLine", line)
}

使用正确的数据加载部分视图。

但是当我想保存数据时 - 我的列表似乎有一行,但行中没有数据。我是部分视图的新手,但似乎MVC没有将部分视图数据映射到List&lt;&gt;这创建了部分视图列表。

我做错了吗?

在控制器中,当我尝试将数据读入我的对象以将它们发送回数据库时,我这样做:

item.TransactionLines = new List<TransactionLineDto>();
foreach (var line in model.Transaction.TransactionLines)
{
    item.TransactionLines.Add(new TransactionLineDto
        {
            Id = line.Id,
            CostCentreId = line.CostCentreId,
            SubCategoryId = line.SubCategoryId,
            TransactionId = model.Transaction.Id,
            Amount = line.Amount
        });
}

但是,我发现所有值都是0.看来局部视图不会将数据返回给View的模型。这是预期的行为,还是我做错了什么?

我试过'Partial'和'RenderPartial'。不确定为什么是正确的,因为它们都会导致同样的问题。

1 个答案:

答案 0 :(得分:0)

如果您检查HTML,您会看到部分内部下拉列表的名称属性为CategoryId。这是错误的,因为它应该像Transaction.TransactionLines[0].CategoryId。否则,ASP.NET MVC将无法将值正确映射到模型。解决此问题的最简单方法是使用for循环并在主视图中移动部分视图HTML。

for (int i = 0; i < model.Transaction.TransactionLines.Count; i++)
{
    <div class="form-group">
        <label for="cmbCategory0" class="col-lg-1 control-label">Category:</label>
        <div class="col-lg-3">
        @Html.DropDownListFor(x => x.Transaction.TransactionLines[i].CategoryId,
                                   new SelectList(x.Transaction.TransactionLines[i].References.Categories, "Value", "Text", x.Transaction.TransactionLines[i].CategoryId), "Select one",
                                   new { @onchange = "populateSubCategory(0)", @class = "cmbCategory form-control" })
        </div>
    </div>
}