我正在使用MVC 3,Razor视图和EditorFor模板。
我有三个简单的嵌套模型: -
public class BillingMatrixViewModel
{
public ICollection<BillingRateRowViewModel> BillingRateRows { get; set; }
public BillingMatrixViewModel()
{
BillingRateRows = new Collection<BillingRateRowViewModel>();
}
}
public class BillingRateRowViewModel
{
public ICollection<BillingRate> BillingRates { get; set; }
public BillingRateRowViewModel()
{
BillingRates = new Collection<BillingRate>();
}
}
public class BillingRate
{
public int Id { get; set; }
public int Rate { get; set; }
}
BillingMatrixViewModel有一个视图: -
@using System.Collections
@using WIP_Data_Migration.Models.ViewModels
@model WIP_Data_Migration.Models.ViewModels.BillingMatrixViewModel
<table class="matrix" id="matrix">
<tbody>
<tr>
@Html.EditorFor(model => Model.BillingRateRows, "BillingRateRow")
</tr>
</tbody>
</table>
BillingRateRow有一个名为BillingRateRow的编辑模板: -
@using System.Collections
@model IEnumerable<WIP_Data_Migration.Models.ViewModels.BillingRateRowViewModel>
@foreach (var item in Model)
{
<tr>
<td>
@item.BillingRates.First().LabourClass.Name
</td>
@Html.EditorFor(m => item.BillingRates)
</tr>
}
BillingRate有一个编辑模板: -
@model WIP_Data_Migration.Models.BillingRate
<td>
@Html.TextBoxFor(model => model.Rate,
new {style = "width: 20px"})
</td>
为每个输入生成的标记是: -
<input name="BillingMatrix.BillingRateRows.item.BillingRates[0].Rate" id="BillingMatrix_BillingRateRows_item_BillingRates_0__Rate" style="width: 20px;" type="text" value="0"/>
请注意BillingRate索引的名称和ID属性处理得很好,但BillingRateRows没有索引而是'.item。'。从我的研究开始,这是因为由于foreach循环而导致上下文被拉出,因此循环不是必需的。
我想实现: -
<input name="BillingMatrix.BillingRateRows[0].BillingRates[0].Rate" id="BillingMatrix_BillingRateRows_0_BillingRates_0__Rate" style="width: 20px;" type="text" value="0"/>
如果我将BillingRateRow视图更改为: -
@model WIP_Data_Migration.Models.ViewModels.BillingRateRowViewModel
<tr>
@Html.EditorFor(m => Model.BillingRates)
</tr>
它会抛出一个InvalidOperationException,'传递给字典的模型项的类型为System.Collections.ObjectModel.Collection [BillingRateRowViewModel],但是这个字典需要一种BillingRateRowViewModel。
任何人都可以对此有所了解吗?
答案 0 :(得分:1)
我猜这里,但可能是因为你将模板名称传递给帮手。尝试以下两种选择之一。重命名模板以匹配类型(即BillingRateRows.cshtml)或在模型上使用UIHintAttribute:
public class BillingMatrixViewModel
{
[UIHint("BillingRateRow")]
public ICollection<BillingRateRowViewModel> BillingRateRows { get; set; }
}