Подтвердить что ты не робот

Создание элемента SelectListItem с отключенным атрибутом = "disabled"

Я не вижу способ создать через HtmlHelper, a SelectListItem, который выплевывает следующий HTML:

<option disabled="disabled">don't click this</option>

Единственными свойствами SelectListItem являются:

new SelectListItem{
  Name = "don't click this",
  Value = string.Empty,
  Selected = false
}

Единственное, что я вижу, это

  • Подкласс SelectListItem, чтобы добавить свойство Enabled, чтобы получить значение для представления
  • Не использовать HTML-помощник для DropDownList
  • Создайте новое расширение HtmlHelper, которое принимает мой новый EnablableSelectList и добавляет мой атрибут disabled.
4b9b3361

Ответ 1

Это то, что я могу попробовать, прежде чем полностью воссоздать помощника. Основная идея заключается в том, что Html, который вы получаете от помощника, должен быть хорошо сформирован, поэтому его следует безопасно анализировать. Таким образом, вы можете использовать эту идею, создав собственное расширение, которое использует существующее расширение, но добавляет функции для отключения элементов.

Что-то вроде этого может сделать (полностью непроверено)

public class CustomSelectItem : SelectListItem
{
    public bool Enabled { get; set; }
}

public static class CustomHtmlHelpers
{
    public static MvcHtmlString MyDropDownList(this HtmlHelper html, IEnumerable<CustomSelectItem> selectList)
    {
        var selectDoc = XDocument.Parse(html.DropDownList("", (IEnumerable<SelectListItem>)selectList).ToString());

        var options = from XElement el in selectDoc.Element("select").Descendants()
                                    select el;

        foreach (var item in options)
        {
            var itemValue = item.Attribute("value");
            if (!selectList.Where(x => x.Value == itemValue.Value).Single().Enabled)
                item.SetAttributeValue("disabled", "disabled");
        }

        // rebuild the control, resetting the options with the ones you modified
        selectDoc.Root.ReplaceNodes(options.ToArray());
        return MvcHtmlString.Create(selectDoc.ToString());
    }
}

Ответ 2

Свойство Disabled поддерживается, поскольку ASP.NET MVC 5.2:

new SelectListItem {
    // ...
    Disabled = true
}

Смотрите ссылку API.

Ответ 3

Вариант Clientside: если вы, например, даете своему раскрывающему списку класс "custom" и элементы, которые должны быть не поддающимися выбору, например, значение -1, вы можете сделать что-то вроде:

$('select.custom option[value=-1]').each(function () {
    $(this).attr("disabled", "disabled");
});

Ответ 4

Если все, что вы пытаетесь сделать, это запретить пользователю выбирать определенное значение из списка, кажется, что более простой и эффективный с точки зрения времени способ сделать это - использовать проверку ввода. Возможно, вы все равно можете делать это, если хотите проверить, что они сделали выбор для начала.