Как установить отключенный в MVC htmlAttribute

При использовании Помощника HTML, что лучший метод должен установить атрибут на основе условия. Например,

<%if (Page.User.IsInRole("administrator")) {%>
<%=Html.TextBoxFor(m => m.FirstName, new {@class='contactDetails'}%>
<%} else {%>
<%=Html.TextBoxFor(m => m.FirstName, new {@class='contactDetails', disabled = true}%>
<%}%>

Должен быть лучший способ программно добавить всего один дополнительный KeyPair к анонимному типу? Не может использовать

new { .... disabled = Page.User.IsInRole("administrator") ... }

поскольку браузер берет любое отключенное значение атрибута в качестве создания отключенного входа

19
задан Ollie 23 March 2010 в 12:34
поделиться

6 ответов

Я мог бы предложить вам использовать mvccontrib.FluentHtml.

Вы можете сделать что-то вроде этого

 <%=this.TextBox(m=>m.FirstNam ).Disabled(Page.User.IsInRole("administrator"))%>
14
ответ дан 30 November 2019 в 02:56
поделиться

Page.User.IsInRole ("администратор")? null: new {disabled = "disabled"}

8
ответ дан 30 November 2019 в 02:56
поделиться

Использование предложения @SLaks для использования метода расширения и использование примера метода расширения Джереми Кларка Я написал метод расширения, поэтому я теперь можно сделать

Html.TextBoxFor(m => m.FirstName,new{class='contactDetails', ...},Page.User.IsInRole("administrator"));

Не уверен, есть ли лучший метод

public static class InputExtensions
{

    public static IDictionary<string, object> TurnObjectIntoDictionary(object data)
    {
        var attr = BindingFlags.Public | BindingFlags.Instance;
        var dict = new Dictionary<string, object>();
        if (data == null)
            return dict;
        foreach (var property in data.GetType().GetProperties(attr))
        {
            if (property.CanRead)
            {
                dict.Add(property.Name, property.GetValue(data, null));
            }
        }
        return dict;

    }

    public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes, bool disabled)
    {
        IDictionary<string, object> values =  TurnObjectIntoDictionary(htmlAttributes);

        if (disabled)
            values.Add("disabled","true");


        return htmlHelper.TextBoxFor(expression, values);
    }

    public static MvcHtmlString TextAreaFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes, bool disabled)
    {
        IDictionary<string, object> values = TurnObjectIntoDictionary(htmlAttributes);

        if (disabled)
            values.Add("disabled", "true");


        return htmlHelper.TextAreaFor(expression, values);
    }

    public static MvcHtmlString CheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool>> expression, object htmlAttributes, bool disabled)
    {
        IDictionary<string, object> values = TurnObjectIntoDictionary(htmlAttributes);

        if (disabled)
            values.Add("disabled", "true");


        return htmlHelper.CheckBoxFor(expression, values);
    }
}
4
ответ дан 30 November 2019 в 02:56
поделиться

Вы также можете определить этот параметр таким образом:

Page.User.IsInRole("administrator")
  ? (object)new { @class='contactDetails'} 
  : (object)new { @class='contactDetails', disabled = true}
1
ответ дан 30 November 2019 в 02:56
поделиться

Вы можете рассмотреть возможность написания собственного класса HtmlHelper Extension с новым методом TextBox:

public static class HtmlHelperExtensions
{
    public static MvcHtmlString TextBoxFor(this HtmlHelper htmlHelper, Expression<Func<TModel, TProperty>> expression, string cssClass, bool disabled)
    {
        return disabled 
            ? Html.TextBoxFor(expression, new {@class=cssClass, disabled="disabled"})
            : Html.TextBoxFor(expression, new {@class=cssClass})
    }
}

теперь (если этот новый класс находится в том же пространстве имен, или вы импортировали новое пространство имен в заголовок вашей страницы, или в раздел pages в web. config) вы можете сделать это на вашей aspx странице:

<%=Html.TextBoxFor(m => m.FirstName, "contactDetails", Page.User.IsInRole("administrator")) %>
1
ответ дан 30 November 2019 в 02:56
поделиться

Вам нужно будет передать Dictionary и добавить ключ disabled внутри оператора if .

Я рекомендую сделать перегрузку метода расширения, который принимает параметр bool disabled и добавляет его в RouteValueDictionary , созданный из параметра атрибутов, если он истина . (Вы также можете удалить запись disabled из RouteValueDictionary , если она false , и не принимать другой параметр)

2
ответ дан 30 November 2019 в 02:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: