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

相關問題