Могу ли я отправить SelectList через параметры управления UIHint? - PullRequest
1 голос
/ 10 августа 2011

Могу ли я отправить SelectList через аннотацию данных?Что-то вроде ...

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

Я не понимаю синтаксис, но это кажется возможным.Если да, то как мне получить к нему доступ из шаблона редактора?

Если нет, как я могу динамически отправить SelectList в шаблон редактора DropDownList?Я специально хотел бы избежать создания отдельного шаблона для каждого SelectList - у меня их слишком много.Спасибо

РЕДАКТИРОВАТЬ: Я работаю над вторым вариантом (Reflection), потому что я думал, что он может быть более прямым, чем переопределение этого 15-слогового монстра, DataAnnotationsModelMetadataProvider.

1 Ответ

1 голос
/ 10 августа 2011

Возможно, вы захотите взглянуть на это сообщение в блоге:

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, как указано в сообщении в блоге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...