3

渡された選択リストから各値の「ブートストラップ スタイル」のラジオ ボタンを作成するエディター テンプレートを作成しようとしています (Html.DropDownForメソッドがドロップダウン リストを作成するのと同じように)

だから私は私の見解で呼び出しを持っています:

@Html.EditorFor(model => model.FaultTypeID,"RadioButtonList", 
        new SelectList(Model.AllowdeFaultTypes, "FaultTypeID", "FaultTypeName"))

次に、RadioButtonList のテンプレート:

@foreach (var item in ViewData["Items"] as SelectList)
{
    <a>@item.Text</a> <b>@item.Value</b>
}

しかし、変換は失敗し、NullReferanceExeption. リフレクションにより、ViewData["Items"]値が型であることがわかりますSystem.Collections.Generic.List<CamelotFaultManagement.DAL.FaultType>

RadioButtonList問題は、エディター テンプレートをクラスと密接に結合したくCamelotFaultManagement.DAL.FaultTypeないということです。それを行う意味がありません。汎用エディター テンプレートが必要です。

4

1 に答える 1

7

エディター テンプレートで、ViewData["Items"]設定したことのないプロパティを使用しているようです。そのようなプロパティを使用する場合は、割り当て済みであることを確認してください。

@Html.EditorFor(
    model => model.FaultTypeID,
    "RadioButtonList", 
    new { Items = new SelectList(Model.AllowdeFaultTypes, "FaultTypeID", "FaultTypeName") }
)

そうは言っても、いくつかの ViewData を使用するアプローチは、私にはまったく間違っているようです。

ビュー モデルを定義するだけです (ASP.NET MVC ではいつものように)。

public class RadioListViewModel
{
    public string Value { get; set; }
    public IEnumerable<SelectListItem> Values { get; set; }
}

次に、エディター テンプレートをこのビュー モデルに強く型付けすることができます。もちろん、エディタ テンプレートは次の場所に保存され~/Views/Shared/EditorTemplates/RadioListViewModel.cshtmlます。

@model IRadioListViewModel
@foreach (var item in Model)
{
    <a>@item.Text</a> <b>@item.Value</b>
}

あとは、このビュー モデルをメイン ビュー モデルで使用するだけです。

public class MyViewModel
{
    public RadioListViewModel FaultTypes { get; set; }
    ...
}

次に、ビュー内で対応するエディター テンプレートをレンダリングします。

@model MyViewModel
...
@Html.EditorFor(x => x.FaultTypes)

シンプルで、従来型の、厳密に型指定されたもの。

于 2013-02-25T13:12:09.630 に答える