Создание SelectListItem с атрибутом disabled = "disabled" - PullRequest
26 голосов
/ 16 апреля 2010

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

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

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

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

Единственный вариант, который я вижу, это

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

Ответы [ 5 ]

22 голосов
/ 25 сентября 2014

Свойство Disabled поддерживается начиная с ASP.NET MVC 5.2:

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

См. Справочник по API .

20 голосов
/ 16 апреля 2010

Это то, что я мог бы попробовать, прежде чем полностью воссоздать помощника. Основная идея заключается в том, что 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());
    }
}
5 голосов
/ 03 августа 2013

Параметр на стороне клиента: если вы, например, задаете вашему раскрывающемуся списку класс 'custom' и элементы, для которых должно быть не выбрано значение -1 (например), вы можете сделать что-то вроде:

$('select.custom option[value=-1]').each(function () {
    $(this).attr("disabled", "disabled");
});
0 голосов
/ 25 сентября 2018

----- Вариант 1 Контроллер:

var ExpectedShipmentsRange = new List ();

ExpectedShipmentsRange.Add(new SelectListItem() { Text = "Selected number of shipments", Value="0", Disabled = true, Selected  = true });
ExpectedShipmentsRange.Add(new SelectListItem() { Text = "0 to 20 shipments", Value = "0-20" });
ExpectedShipmentsRange.Add(new SelectListItem() { Text = "20 to 40 shipments", Value = "20-40" });

ViewBag.ExpectedShipmentsRange = ExpectedShipmentsRange;

Вид:

@Html.DropDownListFor(m => m.ExpectedShipments, (IEnumerable<SelectListItem>)@ViewBag.ExpectedShipmentsRange, new { @class = "form-control" })

----- Вариант 2 Контроллер:

ViewBag.citiesSa = _dbContext.Countries.ToList();

Вид:

@Html.DropDownListFor(m => m.City, new SelectList(@ViewBag.citiesSa, "Id", "Name"), "Select your city", new { @class = "form-control" })

----- Опция 3 не поддерживает отключенную опцию:

List<SelectListItem> ExpectedShipmentsRange = new List<SelectListItem>();
ExpectedShipmentsRange.Add(new SelectListItem() { Text = "0 to 20 shipments", Value = "0-20" });
ExpectedShipmentsRange.Add(new SelectListItem() { Text = "20 to 40 shipments", Value = "20-40" });

ViewBag.ExpectedShipmentsRange = new SelectList(ExpectedShipmentsRange, "Value", "Text");

Вид:

@Html.DropDownListFor(m => m.ExpectedShipments, (SelectList)@ViewBag.ExpectedShipmentsRange, new { @class = "form-control" })
0 голосов
/ 16 апреля 2010

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

...