Возможно, вы захотите взглянуть на это сообщение в блоге:
http://mikevdm.com/BlogEntry/Key/Using-UIHint-With-ControlParameters-in-MVC
Вот соответствующая цитата:
ControlParameters ограничены в том, что ониможет принимать только значения констант (время компиляции) в несколько необычном синтаксисе, но они допускают простые значения (истина / ложь, перечисляемые значения и т. д.), поэтому шаблонный помощник может вести себя немного по-разному в зависимости от параметров.Это позволяет вам объединять связанные функции, обычно встречающиеся в отдельных шаблонах (с большим количеством дублирующегося кода), в один шаблон.
В моем приложении все мои выпадающие списки были либо булевыми значениями (да), Нет, не задано) или перечисления.Я пошел по пути создания отдельного шаблона для каждого, но с помощью вспомогательных методов, чтобы сделать код внутри каждого шаблона очень минимальным.
Например, у меня есть шаблон с именем 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
, как указано в сообщении в блоге.