带有Html Helper的条件html属性

时间:2016-01-20 00:37:27

标签: c# asp.net-mvc razor html-helper

我正在使用Html助手创建一个复选框。在某些情况下,我想将disabled属性添加到htmlAttribute对象中。我有以下代码:

@if (Model.IsAuthorized)
{
    @Html.CheckBoxFor(x => @Model.Property, new { @class = "input-class" })
}
else
{
    @Html.CheckBoxFor(x => @Model.Property, new { @class = "input-class", @disabled = "disabled" })
}

我想让这段代码更简洁。有没有办法在一行中有条件地添加某些html属性/没有块条件?

2 个答案:

答案 0 :(得分:7)

虽然你可以使用

@Html.CheckBoxFor(m => m.Property, Model.IsAuthorized ? (object)new { @class = "input-class", disabled = "disabled" } : (object)new { @class = "input-class"});

在一行代码中执行此操作,在您的情况下,可能会导致模型绑定失败。

CheckBoxFor()方法生成2个输入,带value="True"的复选框和带value="False"的隐藏输入。如果Property的初始值为trueIsAuthorizedtrue,则结果是该复选框已停用且不会发布值。但是,隐藏的输入将被提交并绑定到您的模型,导致Propertyfalse(当它应为true时)

为了正确处理模型绑定,您需要if

@if (Model.IsAuthorized)
{
    @Html.CheckBoxFor(x => m.Property, new { @class = "input-class" })
}
else
{
    @Html.HiddenFor(m => m.Property) // necessary to post back the initial value
    <input type="checkbox" @(Model.Property ? "checked" : null) disabled />
}

答案 1 :(得分:0)

尝试以下代码:

@{
 var attr = new { @class = "input-class" };
 if (Model.IsAuthorized)
 {
    attr = new { @class = "input-class", @disabled = "disabled" };
 }
}
@Html.CheckBoxFor(x => @Model.Property, attr)