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
- Subclase el
SelectListItem
para agregar una propiedadEnabled
para obtener el valor para la vista - No usar el ayudante HTML para DropDownList
- Cree una nueva extensión
HtmlHelper
que acepte mi nuevoEnablableSelectList
y agregue mi atributodisabled
.
----- 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.