Я пытаюсь создать список выбора. Я отлично создал его, используя коллекцию из моей модели просмотра, которая позволяет мне устанавливать значение и текст каждой опции с помощью следующего кода:

@Html.DropDownListFor(model => model.Networks, new SelectList(Model.Networks, "NetworkID", "Name"), new { @class="form-control" })

Model.Networks содержит еще одно свойство, называемое CountryId. Я хотел бы добавить атрибут к каждому тегу option, чтобы он выглядел так:

<option value="[NetworkId]" data-countryId="[CountryId]">Canada</option>

Как мне это сделать?

5
Shane LeBlanc 4 Окт 2013 в 03:56

1 ответ

Лучший ответ

Вы можете создать класс Form Helper для создания настраиваемого раскрывающегося списка и создать настраиваемый класс selectListItem с дополнительным свойством itemsHtmlAttributes типа IDictionary - см. Ниже. Возможно, вам придется поэкспериментировать с атрибутами id или name, чтобы заставить работать привязку модели по умолчанию. Ниже немного запутано, я бы предложил использовать TagBuilder для создания тегов select и option:

public class SelectListItemCustom : SelectListItem
{
    public IDictionary<string, object> itemsHtmlAttributes { get; set; }
}

public static class FormHelper
{
    public static MvcHtmlString DropDownListForCustom(this HtmlHelper htmlHelper, string id, List<SelectListItemCustom> selectListItems)
    {
        var selectListHtml = "";

        foreach (var item in selectListItems)
        {
            var attributes = new List<string>();
            foreach (KeyValuePair<string, string> dictItem in item.itemsHtmlAttributes)
            {
                attributes.Add(string.Format("{0}='{1}'", dictItem.Key, dictItem.Value));
            }
            // do this or some better way of tag building
            selectListHtml += string.Format(
                "<option value='{0}' {1} {2}>{3}</option>", item.Value,item.Selected ? "selected" : string.Empty,string.Join(" ", attributes.ToArray()),item.Text);
        }
        // do this or some better way of tag building
        var html = string.Format("<select id='{0}' name='{0}'>{1}</select>", id, selectListHtml);

        return new MvcHtmlString(html);
    }
}

ПОСМОТРЕТЬ:

@{
    var item = new SelectListItemCustom { Selected = true, Value = "123", Text = "Australia", itemsHtmlAttributes = new Dictionary<string, object> { { "countrycode", "au" } } };
    var items = new List<SelectListItemCustom> { item };

    Html.Raw(Html.DropDownListForCustom("insertIdHere", items))
}
6
sambo 30 Мар 2015 в 08:09
1
Я не могу заставить этот код работать - я получаю сообщение об ошибке метода «ForEach», в котором говорится, что этот метод не существует в определении IDictionary.
 – 
Nick Coad
7 Июл 2014 в 03:49
1
Foreach (KeyValuePair <строка, объект>
 – 
Chuck D
17 Июл 2018 в 20:58