次のブログ記事をご覧ください。
http://mikevdm.com/BlogEntry/Key/Using-UIHint-With-ControlParameters-in-MVC
関連する引用は次のとおりです。
ControlParameters は、やや変わった構文で (コンパイル時の) 定数値のみを受け入れることができるという点で制限されていますが、単純な値 (true/false、列挙値など) を許可するため、テンプレート化されたヘルパーはベースでわずかに異なる動作をすることができます。パラメータについて。これにより、通常は個々のテンプレート (多くのコード重複) にある関連する機能を 1 つのテンプレートに組み合わせることができます。
私のアプリでは、すべてのドロップダウン リストが null 可能なブール値 (はい、いいえ、未設定) または列挙型のいずれかでした。それぞれに個別のテンプレートを作成する方法をとりましたが、ヘルパー メソッドを使用して各テンプレート内のコードを最小限に抑えました。
たとえば、Level (Level
は列挙型) というテンプレートがあります。
コードは、プラスを使用するカップルです....
@Html.DropDownListFor(model => model, Model.ToSelectList<Level>())
これらの拡張メソッドを次の目的で使用しますToSelectList
。
public static SelectList ToSelectList<TEnum>(this TEnum? value) where TEnum : struct
{
var items = GetSelectListItems<TEnum>().ToList();
items.Insert(0, new SelectListItem { Value = "", Text = LabelIfNull });
return new SelectList(items, "Value", "Text", value.ToString());
}
public static SelectList ToSelectList<TEnum>(this TEnum value)
{
var items = GetSelectListItems<TEnum>();
return new SelectList(items, "Value", "Text", value.ToString());
}
public static IEnumerable<SelectListItem> GetSelectListItems<TEnum>()
{
var values = System.Enum.GetNames(typeof(TEnum));
return values.Select(v => new SelectListItem { Value = v, Text = v.ToFriendlyName() });
}
public static SelectList ToSelectList(this bool isTrue)
{
var items = new[]
{
new SelectListItem { Value = "true", Text = LabelIfTrue },
new SelectListItem { Value = "false", Text = LabelIfFalse }
};
return new SelectList(items, "Value", "Text", isTrue.ToString());
}
public static SelectList ToSelectList(this bool? isTrue)
{
var items = new[]
{
new SelectListItem { Value = string.Empty, Text = LabelIfNull },
new SelectListItem { Value = "true", Text = LabelIfTrue },
new SelectListItem { Value = "false", Text = LabelIfFalse }
};
return new SelectList(items, "Value", "Text", !isTrue.HasValue ? string.Empty : isTrue.Value.ToString());
}
コントロール パラメーターを使用して 1 つのテンプレートを作成することもできますがDataAnnotationsModelMetadataProvider
、ブログ投稿に示されているように、独自の を作成する必要があります。