2

私は MVC 3、Razor ビュー、および EditorFor テンプレートを使用しています。

私は3つの単純なネストされたモデルを持っています:-

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 インデックスの name 属性と 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>

ディクショナリに渡されたモデル アイテムのタイプは System.Collections.ObjectModel.Collection [BillingRateRowViewModel] ですが、このディクショナリには BillingRateRowViewModel のタイプが必要です。

誰でもこれに光を当てることができますか?

4

1 に答える 1

1

私はここで推測していますが、テンプレート名をヘルパーに渡しているためかもしれません。2 つのオプションのいずれかを試してください。タイプに一致するようにテンプレートの名前を変更するか (BillingRateRows.cshtml など)、モデルで UIHintAttribute を使用します。

public class BillingMatrixViewModel
{
    [UIHint("BillingRateRow")]
    public ICollection<BillingRateRowViewModel> BillingRateRows { get; set; }
}
于 2012-11-01T05:08:16.217 に答える