Asp.net mvc 3 嵌套EditorTemplates时出错

Asp.net mvc 3 嵌套EditorTemplates时出错,asp.net-mvc-3,razor,mvc-editor-templates,Asp.net Mvc 3,Razor,Mvc Editor Templates,我正在使用MVC 3、Razor视图和模板编辑器 我有三个简单的嵌套模型:- public class BillingMatrixViewModel { public ICollection<BillingRateRowViewModel> BillingRateRows { get; set; } public BillingMatrixViewModel() { BillingRateRows = new Collection<Bi

我正在使用MVC 3、Razor视图和模板编辑器

我有三个简单的嵌套模型:-

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; } 
}
公共类计费矩阵XViewModel
{
公共ICollection BillingTerrows{get;set;}
公共计费矩阵XViewModel()
{
Billingratrows=新集合();
}
}
公共类BillingTerrowViewModel
{
公共ICollection BillingRates{get;set;}
公共BillingTerrowViewModel()
{
BillingRates=新集合();
}
}
公费舱
{   
公共int Id{get;set;}
公共整数速率{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>
@使用System.Collections
@使用WIP_数据_Migration.Models.ViewModels
@模型在制品数据迁移.Models.ViewModels.BillingMatrixViewModel
@EditorFor(model=>model.billingratrows,“billingratrow”)
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>
}
@使用System.Collections
@模型IEnumerable
@foreach(模型中的var项目)
{
@item.BillingRates.First().LabourClass.Name
@EditorFor(m=>item.BillingRates)
}
BillingRate有一个编辑器模板:-

@model WIP_Data_Migration.Models.BillingRate

<td>
  @Html.TextBoxFor(model => model.Rate,
                new {style = "width: 20px"})
</td>
@model-WIP\u-Data\u-Migration.Models.BillingRate
@Html.TextBoxFor(model=>model.Rate,
新{style=“width:20px”})
为每个输入生成的标记为:-

<input name="BillingMatrix.BillingRateRows.item.BillingRates[0].Rate"    id="BillingMatrix_BillingRateRows_item_BillingRates_0__Rate" style="width: 20px;" type="text" value="0"/>

请注意,BillingRate索引的name和ID属性处理得很好,但Billingratrows没有索引“.item.”。从我的研究来看,这是因为上下文由于foreach循环而被拉出,所以循环应该是不必要的

我想实现:-

<input name="BillingMatrix.BillingRateRows[0].BillingRates[0].Rate" id="BillingMatrix_BillingRateRows_0_BillingRates_0__Rate" style="width: 20px;" type="text" value="0"/>

如果我将BillingTerrow视图更改为:-

@model WIP_Data_Migration.Models.ViewModels.BillingRateRowViewModel

<tr>
    @Html.EditorFor(m => Model.BillingRates)
</tr>
@model-WIP\u-Data\u-Migration.Models.ViewModels.BillingTerrowViewModel
@EditorFor(m=>Model.BillingRates)
它将抛出InvalidOperationException,“传递到字典中的模型项的类型为System.Collections.ObjectModel.Collection[BillingTerrowViewModel],但此字典需要BillingTerrowViewModel的类型


有人能解释一下吗?

我在这里猜测,但可能是因为您正在将模板名称传递给帮助程序。尝试两个选项中的一个。重命名模板以匹配类型(即BillingTerrows.cshtml),或在模型上使用UIHintAttribute:

public class BillingMatrixViewModel
{
    [UIHint("BillingRateRow")]
    public ICollection<BillingRateRowViewModel> BillingRateRows { get; set; }
}
公共类计费矩阵XViewModel
{
[UIHint(“巨浪”)]
公共ICollection BillingTerrows{get;set;}
}

我想你是对的,我通过做类似的事情解决了这个问题:在BillingMatrix XViewModel中,我将变量BillingTerrows重命名为BillingMatrix视图中的BillingTerrowViewModels,在BillingMatrix视图中将@Html.EditorFor(model=>model.BillingTerrows,“BillingTerrow”)更改为@Html.EditorFor(model=>model.BillingTerrowViewModels)