Как добавить дополнительные html атрибуты в расширение для DropDownListFor

Я пытаюсь написать расширение для DropDownListFor:

public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, object htmlAttributes, bool enabled)
{
    return htmlHelper.DropDownListFor(expression, selectList, null /* optionLabel */, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
}

То, что я хочу достичь, - если включено, то false, но если включено, это правда. Я хочу добавить @disabled="disabled" в атрибуты html, прежде чем давать им AnonymousObjectToHtmlAttributes.

Любые идеи о том, как это сделать?

Ответ 1

Simple! HtmlHelper.AnonymousObjectToHtmlAttributes возвращает RouteValueDictionary. Вы можете добавить значение к этому словарю, вам не нужно добавлять свойство к анонимному объекту.

public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, object htmlAttributes, bool enabled)
{
    var attrs = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
    if (!enabled)
    {
        attrs.Add("disabled", "disabled");
    }
    return htmlHelper.DropDownListFor(expression, selectList, null /* optionLabel */, attrs);
}

Ответ 2

Решение архивных работ. Тем не менее, для того, что вы пытаетесь написать, расширение является излишним.

Просто напишите в своем представлении что-то вроде:

@Html.DropDownListFor(m => m.Id, Model.Values, new { disabled = "disabled" })