Расширение MVC3 Razor: возвращение двух элементов управления - PullRequest
0 голосов
/ 21 ноября 2011

Я пытаюсь создать расширение, которое отображает раскрывающийся список только для чтения. Похоже, что простое добавление атрибута 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);
    }
}

1 Ответ

1 голос
/ 21 ноября 2011

Я думаю, что лучшим подходом было бы иметь EditorTemplate, который визуализирует два поля - из того, что я видел с расширениями HtmlHelper, методы расширения обычно возвращают один элемент управления HTML.

Например, вваш взгляд:

@Html.EditorFor(m => m.SomeField, "ReadOnlyDropDown")

И в шаблоне вашего редактора:

@Html.DropDownListFor(m => m, mySelectList, null, true)
@Html.HiddenFor(m => m)

Кроме того, в вашей форме появятся конфликтующие имена, не так ли?Похоже, что ваши скрытые и выбранные элементы будут отображаться с одним и тем же именем.

Если вы действительно хотите объединить два в одно, я думаю, вы можете просто объединить результаты двух элементов HTML, так как онипросто объекты MvcHtmlString:

var bothFields = select + hidden;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...