我可以通过UIHint控制参数发送SelectList吗?

时间:2011-08-10 00:18:29

标签: asp.net-mvc asp.net-mvc-3 data-annotations selectlist mvc-editor-templates

我可以通过数据注释发送SelectList吗?有点像...

[UIHint("DropDownList", "", new SelectList(new[] {"one","two","three"}))]
public virtual int? OptionID { get; set; }

我不懂语法,但这似乎有可能。如果是这样,我如何从编辑器模板访问它?

如果没有,我怎么能动态地将SelectList发送到DropDownList编辑器模板?我特别想避免为每个SelectList创建一个单独的模板 - 我有太多它们。感谢

编辑:我正在研究第二个选项(反射)因为我认为它可能比重写那个15音节怪物DataAnnotationsModelMetadataProvider更直接。

1 个答案:

答案 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,如博客文章中所示。