你可能想看看这个博客帖子:
http://mikevdm.com/BlogEntry/Key/Using-UIHint-With-ControlParameters-in-MVC
下面是相关报价:
ControlParameters是有限的,他们只能接受(编译时)常量值,虽然有点不寻常的语法,但它们确实允许简单的值(真/假,枚举值等),所以你的模板助手可以根据参数稍微有点不同。这使您可以将通常在单个模板中找到的相关功能(包含大量代码复制)组合到一个模板中。
在我的应用程序中,我所有的下拉列表都是可空的bools(是,否,未设置)或枚举。我采用了为每个模板创建单独模板的路线,但是使用了辅助方法来使每个模板中的代码非常少。
例如,我有一个名为级别范本(Level
是一个枚举):
的代码只是一对夫妇的usings加....
@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
,如博客文章所示。
感谢您的回复!我以前看过那篇博文。扩展方法比我的新手头有点多,但我会试着理解它。如果我跳过注释和自定义MDP会怎么样 - 您认为有一种方法可以在重写的对象模板中使用反射来将选择列表发送到下拉模板?我应该提出一个单独的问题吗?再次感谢。 – Benjamin
我应该补充一点,虽然我看过那篇博客文章,但是我肯定没有看到相关的引用,所以感谢:) – Benjamin
我的选择列表域都是用户可编辑的EF4.1 dbsets – Benjamin