如何在MVC 5剃刀视图上设置动态只读?

时间:2016-11-22 23:47:47

标签: asp.net-mvc razor

我有一个bool值IsAcre。如果为true,则textbox需要能够接受值。如果为false,则文本框应为readonly。我正在尝试几种不同的方式:

   @Html.EditorFor(model => model.Activity.Acres, new { htmlAttributes = new { @class = "form-control", Model.Activity.IsAcres ? null : @readonly = "readonly" }} ) 

  @Html.TextBoxFor(model => model.Activity.Volume, new { @class = "form-control", @readonly = "@Model.Activity.IsVolume" })

第一个似乎在语法上不正确,第二个呈现为:

readonly="False"

即使它只读取false,文本框仍然设置为readonly,我假设因为bool值是作为字符串传递的。

有没有办法在内联中执行此操作或在整个文本框中使用if / else?

1 个答案:

答案 0 :(得分:3)

readonly属性是boolean attribute,这意味着它的存在代表真值,因此呈现readonly="False"的第二个代码段会使输入成为只读(尽管其无效的html)。另请注意规格

  

布尔属性不允许使用值“true”和“false”。要表示错误值,必须完全省略该属性。

您需要使用第一个代码段中的代码来确保添加或省略属性,尽管您可以使用

等替代方案
@{ var attributes = Model.Activity.IsAcres ? (object)new { @class = "form-control"} : (object)new { @class = "form-control", readonly = "readonly" }; }
@Html.TextBoxFor(model => model.Activity.Volume, attributes)

如果这是您经常使用的内容,那么您可以创建一个HtmlHelper扩展方法,根据另一个属性的值有条件地添加属性(比如说)

@Html.ReadOnlyTextBoxIf(m => m.Activity.Acres, Model.Activity.IsAcres, new { @class = "form-control" })