设置可选的禁用属性

时间:2011-12-08 13:55:30

标签: html asp.net-mvc asp.net-mvc-3

我想禁用表单中的所有字段,这些字段在加载页面时具有值。 例如在此

<td>@Html.TextBoxFor(m => m.PracticeName, new { style = "width:100%", disabled = Model.PracticeName == String.Empty ? "Something Here" : "disabled" })</td>

我想写内联这样的东西。我不想使用if-else并使我的代码更大。 使用javascript / jquery也不受欢迎。

我试着编写false / true,但是1.它可能不是跨浏览器2.Mvc将其解析为字符串,如“True”和“False”。 那我怎么能这样做呢?

P.S。我使用ASP.NET MVC 3:)

2 个答案:

答案 0 :(得分:6)

似乎是自定义助手的合适人选:

public static class HtmlExtensions
{
    public static IHtmlString TextBoxFor<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> ex,
        object htmlAttributes,
        bool disabled
    )
    {
        var attributes = new RouteValueDictionary(htmlAttributes);
        if (disabled)
        {
            attributes["disabled"] = "disabled";
        }
        return htmlHelper.TextBoxFor(ex, attributes);
    }
}

可以像这样使用:

@Html.TextBoxFor(
    m => m.PracticeName, 
    new { style = "width:100%" }, 
    Model.PracticeName != String.Empty
)

显然,帮助器可以更进一步,因此您不需要传递额外的布尔值,但它会自动确定表达式的值是否等于default(TProperty)并且它应用{{1属性。

另一种可能性是这样的扩展方法:

disabled

您将使用标准public static class AttributesExtensions { public static RouteValueDictionary DisabledIf( this object htmlAttributes, bool disabled ) { var attributes = new RouteValueDictionary(htmlAttributes); if (disabled) { attributes["disabled"] = "disabled"; } return attributes; } } 帮助程序:

TextBoxFor

答案 1 :(得分:0)

我使用了达林的答案。但是,当涉及data_my_custom_attribute时,它们不会呈现为data-my-custom-attribute。所以我改变了Darin的代码来处理这个问题。

public static RouteValueDictionary DisabledIf(
    this object htmlAttributes,
    bool disabled
    )
{
    RouteValueDictionary htmlAttributesDictionary
         = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);

    if (disabled)
    {
        htmlAttributesDictionary["disabled"] = "disabled";
    }
    return new RouteValueDictionary(htmlAttributesDictionary);
}