まず、次のようなビュー モデルがあります。
[Required]
[Display(Name = "Department")]
[UIHint("DropDown", "MVC", "SelectListName", "DepartmentSelectList")]
public Guid? DepartmentId { get; set; }
DropDown
次のように機能する(UIHintによって設定された)エディターテンプレートがあります。
@{
var list = this.GetModelSelectList();
}
@Html.DropDownListFor(m => Model, list)
このthis.GetModelSelectList()
呼び出しは、ドロップダウンが ViewData に存在するために使用される SelectList オブジェクトに依存しています。カスタムコントローラーの基本クラスで次のオーバーライドを使用して、これを保証しようとします。
protected override ViewResult View(string viewName, string masterName, object model)
{
var result = base.View(viewName, masterName, model);
if ((model is ViewModel) && (!ViewData.ContainsKey(SelectListsViewDataKey)))
{
var vm = (ViewModel)model;
result.ViewData.Add(SelectListsViewDataKey, vm.GetSelectLists());
}
return result;
}
これにより、選択リストを追加してデータを表示するために、コントローラー全体で明示的な呼び出しを行う必要がなくなります。SelectList 型のプロパティは、常にビュー データで使用できます。
私の質問は、おそらくこの注射のより良い方法があるかどうかです. この種のアプリケーションにより専用または適したエントリ ポイントはありますか?
EDIT:単一のビューモデルプロパティのエディターテンプレートがビューモデルインスタンス全体にアクセスする方法がなく、選択リストオブジェクトがこのインスタンスにあるため、これを行っています。https://stackoverflow.com/a/9867542/8741を参照してください