【问题标题】:Error when nesting EditorTempates嵌套 EditorTempates 时出错
【发布时间】:2012-10-31 09:37:26
【问题描述】:

我正在使用 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 类型。

任何人都可以对此有所了解吗?

【问题讨论】:

    标签: asp.net-mvc-3 razor mvc-editor-templates


    【解决方案1】:

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

    public class BillingMatrixViewModel
    {
        [UIHint("BillingRateRow")]
        public ICollection<BillingRateRowViewModel> BillingRateRows { get; set; }
    }
    

    【讨论】:

    • 我想你就在这里,我通过做类似的事情来解决: 在 BillingMatrixViewModel 我将变量 BillingRateRows 重命名为 BillingRateRowViewModels 在 BillingMatrix 视图中更改了 @Html.EditorFor(model => Model.BillingRateRows, "BillingRateRow") 到 @Html.EditorFor(model => Model.BillingRateRowViewModels)
    猜你喜欢
    • 2021-12-27
    • 2020-10-02
    • 2016-08-22
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多