Расширение EditorFor не работает для htmlAttributes в Asp.Net MVC 5.1

У меня есть следующий код:

public static class HtmlExtendedHelpers
{

    public static IHtmlString eSecretaryEditorFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel,TProperty>> ex, object htmlAttributes, bool disabled )
    {

        if (disabled)
        {
            htmlAttributes.Add(new { @disabled = "disabled" }); //searching for working code as replacement for this line
        }

        return htmlHelper.EditorFor(ex, htmlAttributes);

    }
}

Это работает, когда disabled = false, и все мои альтернативы терпят неудачу, когда i disabled = true. Тогда ни один из htmlAttributes не будет записан.

Переменная htmlAttribute имеет значение VALUE ( включая свойство htmlAttributes :)

htmlAttributes: { class = "form-control" }

Это потому, что у меня есть класс управления формой по умолчанию, и я хочу добавить атрибут: disabled с отключенным значением.

Кто-нибудь знает, как это правильно реализовать?

PS. Начиная с Asp.Net MVC 5.1, есть поддержка htmlAttributes.


person NicoJuicy    schedule 03.06.2016    source источник


Ответы (2)


Вы можете использовать HtmlHelper.AnonymousObjectToHtmlAttributes

var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);

if (disabled)
{
    attributes.Add("disabled", "disabled");
}

В качестве альтернативы вы можете передать атрибут disabled как часть объекта htmlAttributes, что означает, что вам вообще не понадобится оператор if.

htmlAttributes: { class = "form-control", disabled = "disabled" }

В зависимости от того, есть ли у вас пользовательский шаблон EditorFor или нет, вам может потребоваться изменить способ передачи атрибутов html в функцию EditorFor, так как параметр, который она принимает, — additionalViewData — это не то же самое.

В этой статье объясняется более подробно.

Если вы используете шаблон по умолчанию, вы можете передать атрибуты html внутри другого анонимного объекта:

return htmlHelper.EditorFor(ex, new { htmlAttributes = attributes });

Если у вас есть собственный шаблон, вам нужно будет получить атрибуты html и применить их самостоятельно в представлении:

@{
    var htmlAttributes = ViewData["htmlAttributes"] ?? new { };
}
person Electric Sheep    schedule 03.06.2016

Вы можете передать атрибуты в htmlAttributes, как показано ниже:

htmlAttributes: { class = "form-control", disbaled="disabled" }

Также вы можете создать свой атрибут метаданных, который может быть оформлен на вашем ресурсе, для которого вы используете EditorFor.

Чтобы создать собственное свойство метаданных, вы можете реализовать интерфейс IMetadataAware.

person Rishi Tiwari    schedule 03.06.2016