Я не вижу способ создать, через HtmlHelper
, a SelectListItem
это выложит следующий HTML:
Единственные свойства SelectListItem
имеет:
new SelectListItem{
Name = "don't click this",
Value = string.Empty,
Selected = false
}
Единственная опция, которую я вижу, к
SelectListItem
добавить Enabled
свойство для получения значения к представлениюHtmlHelper
расширение, которое принимает мое новое EnablableSelectList
и добавляет мой disabled
атрибут.Это то, что я мог бы попробовать, прежде чем полностью воссоздать помощника. Основная идея заключается в том, что 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());
}
}
Если все, что вы пытаетесь сделать, это запретить пользователю выбирать определенное значение из списка, это кажется более простым и экономичным способом сделать это - использовать проверку ввода. Что вы вполне можете делать в любом случае, если хотите убедиться, что они сделали выбор с самого начала.