Как установить отключенный в MVC htmlAttribute - PullRequest
19 голосов
/ 23 марта 2010

При использовании помощника 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") ... }

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

Ответы [ 8 ]

14 голосов
/ 16 ноября 2011

У меня это тоже работает ...

<%: Html.DropDownList("SportID", (SelectList)ViewData["SportsSelectList"], "-- Select --", new { @disabled = "disabled", @readonly = "readonly" })%>

<%= Html.CheckBoxFor(model => model.IsActive, new { @disabled = "disabled", @readonly = "readonly" })%>
14 голосов
/ 23 марта 2010

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

Вы можете сделать что-то подобное

 <%=this.TextBox(m=>m.FirstNam ).Disabled(Page.User.IsInRole("administrator"))%>
8 голосов
/ 23 марта 2010

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

4 голосов
/ 23 марта 2010

Используя предложение @SLaks для использования метода Extension и используя Пример метода Jeremiah Clark Я написал метод расширения, поэтому теперь могу делать

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

Not Sure, еслихотя есть лучший метод

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);
    }
}
2 голосов
/ 23 марта 2010

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

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

1 голос
/ 13 сентября 2011

Создан метод расширения для объекта, который будет создавать копию входного объекта, исключая любые свойства, которые имеют нулевое значение, и возвращать все это как словарь, что делает его легко используемым в MVC HtmlHelpers:

public static Dictionary<string, object> StripAnonymousNulls(this object attributes)
{
   var ret = new Dictionary<string, object>();
   foreach (var prop in attributes.GetType().GetProperties())
   {
      var val = prop.GetValue(attributes, null);
      if (val != null)
         ret.Add(prop.Name, val);
   }
   return ret;
}

НеЯ уверен, что производительность влияет на отражение через свойства дважды, и ему не очень нравится название метода расширения, но, похоже, он хорошо справляется со своей задачей ...

new {
       @class = "contactDetails",
       disabled = Page.User.IsInRole("administrator") ? "true" : null
    }.StripAnonymousNulls()
1 голос
/ 23 марта 2010

Возможно, вы захотите написать свой собственный класс 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})
    }
}

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

<%=Html.TextBoxFor(m => m.FirstName, "contactDetails", Page.User.IsInRole("administrator")) %>
1 голос
/ 23 марта 2010

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

Page.User.IsInRole("administrator")
  ? (object)new { @class='contactDetails'} 
  : (object)new { @class='contactDetails', disabled = true}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...