如何在MVC htmlAttribute中设置禁用

时间:2010-03-23 12:34:33

标签: c# asp.net-mvc

使用HTML Helper时,根据条件设置属性的最佳方法是什么。例如

<%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 个答案:

答案 0 :(得分:14)

我建议你使用mvccontrib.FluentHtml。

你可以做这样的事情

 <%=this.TextBox(m=>m.FirstNam ).Disabled(Page.User.IsInRole("administrator"))%>

答案 1 :(得分:13)

它对我也有用......

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

<%= Html.CheckBoxFor(model => model.IsActive, new { @disabled = "disabled", @readonly = "readonly" })%>

答案 2 :(得分:8)

Page.User.IsInRole(“管理员”)? null:new {disabled =“disabled”}

答案 3 :(得分:4)

使用@SLaks建议使用Extension方法,并使用Jeremiah Clark's example Extension method我已经编写了一个扩展方法,所以我现在可以做

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 :(得分:2)

您需要传递Dictionary<string, object>,并在disabled语句中添加if密钥。

我建议对带有bool disabled参数的扩展方法进行重载,并将其添加到从属性参数创建的RouteValueDictionary中,如果它是true。 (您也可以从disabled RouteValueDictionary中移除false条目,如果它是{{1}},则不删除其他参数

答案 5 :(得分:1)

你也可以这样定义这个参数:

Page.User.IsInRole("administrator")
  ? (object)new { @class='contactDetails'} 
  : (object)new { @class='contactDetails', disabled = true}

答案 6 :(得分:1)

您可能需要考虑使用新的TextBox方法编写自己的HtmlHelper Extension类:

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的pages部分中),则可以在aspx页面上执行此操作:

<%=Html.TextBoxFor(m => m.FirstName, "contactDetails", Page.User.IsInRole("administrator")) %>

答案 7 :(得分:1)

在Object上创建一个扩展方法,它将创建输入对象的副本,不包括任何null属性,并将其全部作为字典返回,以便在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()