我想禁用表单中的所有字段,这些字段在加载页面时具有值。 例如在此
中<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:)
答案 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);
}