我可以通过数据注释发送SelectList吗?有点像...
[UIHint("DropDownList", "", new SelectList(new[] {"one","two","three"}))]
public virtual int? OptionID { get; set; }
我不懂语法,但这似乎有可能。如果是这样,我如何从编辑器模板访问它?
如果没有,我怎么能动态地将SelectList发送到DropDownList编辑器模板?我特别想避免为每个SelectList创建一个单独的模板 - 我有太多它们。感谢
编辑:我正在研究第二个选项(反射)因为我认为它可能比重写那个15音节怪物DataAnnotationsModelMetadataProvider更直接。
答案 0 :(得分:1)
您可能需要查看此博文:
http://mikevdm.com/BlogEntry/Key/Using-UIHint-With-ControlParameters-in-MVC
这是一个相关的引用:
ControlParameters的局限性在于它们只能接受(编译时)常量值,这种语法有点不寻常,但它们允许简单的vales(true / false,枚举值等),因此你的模板化助手可以表现得很好根据参数略有不同。这允许您将通常在单个模板中找到的相关功能(包含大量代码重复)组合到一个模板中。
在我的应用中,我的所有下拉列表都是可空的bool(是,否,未设置)或枚举。我采取了为每个模板制作单独模板的路线,但使用辅助方法使每个模板中的代码非常小。
例如,我有一个名为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());
}
也许您可以使用控制参数来获取单个模板,但您肯定需要编写自己的DataAnnotationsModelMetadataProvider
,如博客文章中所示。