1

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

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

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

如果没有,我如何动态地将 SelectList 发送到 DropDownList 编辑器模板?我特别想避免为每个 SelectList 制作单独的模板 - 我有太多的模板。谢谢

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

4

1 回答 1

1

你可能想看看这篇博文:

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.

于 2011-08-10T00:39:36.643 回答