Я пытаюсь создать расширение, которое отображает раскрывающийся список только для чтения. Похоже, что простое добавление атрибута readonly="true"
к элементу <select>
не работает, поэтому я хотел бы отобразить отключенный элемент <select>
и скрытый ввод.
Вот код, который у меня есть:
public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> expression,
IEnumerable<SelectListItem> selectList,
object htmlAttributes,
bool isReadonly)
{
var values = new RouteValueDictionary(htmlAttributes);
if (isReadonly) values["disabled"] = "disabled";
var select = htmlHelper.DropDownListFor<TModel, TProperty>(expression, selectList, values);
var hiddenField = htmlHelper.HiddenFor<TModel, TProperty>(expression);
var bothFields = ?;
return bothFields;
}
Как правильно отобразить несколько элементов управления из расширения Razor?
Отредактировано: Решение
Разобрался. Очевидно, вы можете просто позвонить ToString()
на двух элементах и вернуть его. Как отметил Джерад, идентификатор <select>
необходимо изменить, чтобы он не совпадал с идентификатором скрытого ввода. Мой окончательный код выглядит так:
public static MvcHtmlString DropDownListFor<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> expression,
IEnumerable<SelectListItem> selectList,
object htmlAttributes,
bool isReadonly)
{
if (isReadonly)
{
var values = new RouteValueDictionary(htmlAttributes);
values["disabled"] = "disabled";
values["id"] = (expression.Body as MemberExpression).Member.Name + "_Disabled";
var select = htmlHelper.DropDownListFor<TModel, TProperty>(expression, selectList, values);
var hiddenField = htmlHelper.HiddenFor<TModel, TProperty>(expression);
return new MvcHtmlString(select.ToString() + hiddenField.ToString());
}
else
{
return htmlHelper.DropDownListFor<TModel, TProperty>(expression, selectList, htmlAttributes);
}
}