1

我可以通过数据注释发送一个SelectList吗?像...我可以通过UIHint控制参数发送一个SelectList吗?

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

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

如果不是,我该如何动态地将SelectList发送到DropDownList编辑器模板?我特别想避免为每个SelectList制作一个单独的模板 - 我有太多这样的模板。由于

编辑:我工作的第二个选项(反射),因为我想这可能是不是覆盖这15个音节的怪物更直接的DataAnnotationsModelMetadataProvider。

回答

1

你可能想看看这个博客帖子:

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

+0

感谢您的回复!我以前看过那篇博文。扩展方法比我的新手头有点多,但我会试着理解它。如果我跳过注释和自定义MDP会怎么样 - 您认为有一种方法可以在重写的对象模板中使用反射来将选择列表发送到下拉模板?我应该提出一个单独的问题吗?再次感谢。 – Benjamin

+0

我应该补充一点,虽然我看过那篇博客文章,但是我肯定没有看到相关的引用,所以感谢:) – Benjamin

+0

我的选择列表域都是用户可编辑的EF4.1 dbsets – Benjamin

相关问题