textboxfor net mvc create asp asp.net-mvc html-helper

asp.net mvc - net - Creando un SelectListItem con el atributo disabled="disabled"



html helpers textbox (5)

No veo una manera de crear, a través de HtmlHelper , un SelectListItem que escupe el siguiente HTML:

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

Las únicas propiedades que tiene SelectListItem son:

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

La única opción que veo es

  1. Subclase el SelectListItem para agregar una propiedad Enabled para obtener el valor para la vista
  2. No usar el ayudante HTML para DropDownList
  3. Cree una nueva extensión HtmlHelper que acepte mi nuevo EnablableSelectList y agregue mi atributo disabled .

----- Opción 1 Controlador:

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;

Ver:

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

----- Opción 2 Controlador:

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

Ver:

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

----- La opción 3 no admite la opción deshabilitada:

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");

Ver:

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


Esto es algo que podría intentar antes de recrear completamente el ayudante. La idea básica es que el HTML que obtienes del ayudante debe estar bien formado, por lo que debería ser seguro analizarlo. Así que puedes aprovechar esa idea haciendo tu propia extensión que usa la extensión existente pero agrega la funcionalidad para deshabilitar los elementos.

Algo como esto podría hacer (totalmente no probado)

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()); } }


La propiedad Disabled está soportada desde ASP.NET MVC 5.2:

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

Ver la referencia de la API .


Opción del lado del cliente: si, por ejemplo, le asigna a su lista desplegable una clase ''personalizada'' y los elementos que deben ser ineleccionables tienen el valor -1 (por ejemplo), entonces puede hacer algo como:

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


Si todo lo que intenta hacer es evitar que un usuario seleccione un determinado valor de la lista, parece que la forma más sencilla y eficiente de hacerlo es utilizar la validación de entrada. Lo que puede estar haciendo de todos modos, si desea verificar que han hecho una selección para empezar.