你可能想看看这篇博文:
http://mikevdm.com/BlogEntry/Key/Using-UIHint-With-ControlParameters-in-MVC
这是一个相关的报价:
ControlParameters 受到限制,因为它们只能接受(编译时)常量值,采用一种有点不寻常的语法,但它们确实允许简单的值(真/假、枚举值等),因此您的模板化帮助器的行为可能会略有不同关于参数。这允许您将通常在单个模板中找到的相关功能(具有大量代码重复)组合到一个模板中。
在我的应用程序中,我所有的下拉列表都是可为空的布尔值(是,否,未设置)或枚举。我采取了为每个模板制作单独模板的方法,但使用辅助方法使每个模板中的代码非常少。
例如,我有一个名为 Level 的模板(Level
枚举在哪里):
该代码只是几个 usings plus....
@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());
}
Perhaps you could use control parameters to get down to a single template, but you'll definitely need to write your own DataAnnotationsModelMetadataProvider
, as indicated in the blog post.