【问题标题】:Checkbox disabled attribute in ASP.NET MVCASP.NET MVC 中的复选框禁用属性
【发布时间】:2014-01-23 07:30:12
【问题描述】:

我的 ViewModel 具有 selected 和 selectable 的属性。两者都是布尔值。我希望我的视图有一个复选框,当可选为真时启用,当可选为假时禁用。完成此操作的正确 razor 语法是什么?

我在表格中的项目列表上尝试了下面的代码。无论可选值如何,每一行都带有一个禁用的复选框。

 @Html.CheckBoxFor(modelItem => item.Selected, new { @disabled = !item.Selectable })

【问题讨论】:

  • 问题:item 是什么?我在您的 lambda 上看到您有 modelItem => item.Selected,但 item 是否独立于模型本身?或者你的意思是modelItem => modelItem.Selected?

标签: c# asp.net-mvc razor


【解决方案1】:

使用if 条件在辅助方法中实现这一点并不容易,因为以下所有标记都会呈现禁用的复选框。

<input type="checkbox" disabled>
<input type="checkbox" disabled="disabled">
<input type="checkbox" disabled="false">
<input type="checkbox" disabled="no">
<input type="checkbox" disabled="enabled">

这应该适用于剃须刀。简单的 If 条件并呈现您想要的内容。

@if(item.Selected)
{ 
  @Html.CheckBoxFor(modelItem => item.Selected)
}
else
{
    @Html.CheckBoxFor(modelItem => item.Selected, new { @disabled = "disabled"})
}

您可以考虑编写一个自定义的 html 帮助器来为此呈现正确的标记。

【讨论】:

  • 对于 HTML5 我写 new { @disabled = "" } 因为&lt;input type="checkbox" disabled /&gt; 是有效的,并且被 W3C 在他们的示例中使用。
【解决方案2】:

这不起作用,因为&lt;input disabled="anything" /&gt; 将导致禁用控件。只有在应该禁用 @disabled 属性时才需要它。

试试这样的:

@Html.CheckBoxFor(modelItem => item.Selected, item.Selectable ?  (object)new {} :  (object)new { @disabled = "disabled" })

请注意,您可能需要转换为 (object)

【讨论】:

  • 这是一个比所选答案更简洁的选项。您确实需要强制转换为对象;就我而言,我有这个工作:@Html.EditorFor(p => item.Selected, new {htmlAttributes = item.Selectable ? (object)new { } : (object)new { @disabled = "disabled" }})
  • 你可能只能在左侧去 new object()
【解决方案3】:

问题是当您必须添加超过 1 个 HTML 属性时。 真是一团糟:

@if(item.Selected)
{ 
  @Html.CheckBoxFor(modelItem => item.Selected, new { @data_foo = "bar"})
}
else
{
    @Html.CheckBoxFor(modelItem => item.Selected, new { @data_foo = "bar", @disabled = "disabled"})
}

解决这个问题的方法是使用之前加载的IDictionary&lt;string, object&gt;:

var htmlAttributes = new Dictionary<string, object>{
    {"data-foo", "bar"}
};
if(!item.Selected)
{
    htmlAttributes.Add("disabled", "disabled");
}

然后我只创建一次复选框组件:

@Html.CheckBoxFor(modelItem => item.Selected, htmlAttributes)

【讨论】:

    【解决方案4】:

    对不起,我之前的回答错了。

    一旦属性被禁用,输入元素就会被禁用。值是真还是假都没有关系。在 HTML 中,您不能将 disabled 设置为 false。

    所以只有在条件有效时才需要设置 disabled 属性。

    类似:

    object attributes = null;
    if (!item.Selectable)
    {
        attributes = new { disabled = "disabled"};
    }
    @Html.CheckBoxFor(modelItem => item.Selected, attributes)
    

    【讨论】:

    • 我试过你的建议。一切都以禁用状态返回。
    • 你可能需要@前缀
    猜你喜欢
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多