你可能想看看這個博客帖子:
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