79

我只想知道Html.CheckBoxForASP.NET MVC 中 HTML 助手的正确语法。

我想要完成的是使用 ID 值最初检查复选框,以便我可以在控制器中引用它以查看它是否仍然被选中。

下面会是正确的语法吗?

@foreach (var item in Model.Templates) 
{ 
    <td> 
        @Html.CheckBoxFor(model => true, item.TemplateId) 
        @Html.LabelFor(model => item.TemplateName)
    </td> 
}
4

7 回答 7

127

这不是正确的语法

第一个参数不是复选框值,而是复选框的视图模型绑定,因此:

@Html.CheckBoxFor(m => m.SomeBooleanProperty, new { @checked = "checked" });

第一个参数必须标识模型中的布尔属性(它是一个表达式,而不是返回值的匿名方法),第二个属性定义任何其他 HTML 元素属性。我不是 100% 确定上述属性最初会检查您的复选框,但您可以尝试。但要小心。即使它可能会起作用,但在加载有效的模型数据并且该特定属性设置为false.

正确的方法

尽管我的正确建议是为您的视图提供初始化模型,并将该特定布尔属性初始化为true.

属性类型

根据 Asp.net MVCHtmlHelper扩展方法和内部工作,复选框需要绑定到布尔值,而不是您想要做的整数。在这种情况下,隐藏字段可以存储id.

其他帮手

当然,您可以使用其他辅助方法来获得有关复选框值和行为的更大灵活性:

@Html.CheckBox("templateId", new { value = item.TemplateID, @checked = true });

注意 checked 是 HTML 元素的布尔属性,而不是 value 属性,这意味着您可以为其分配任何值。正确的 HTML 语法不包括任何赋值,但无法提供具有未定义属性的匿名 C# 对象,该属性将呈现为 HTML 元素属性。

于 2012-10-01T13:58:31.583 回答
17

默认情况下,以下代码不会生成选中的复选框,因为模型属性会覆盖 html 属性:

@Html.CheckBoxFor(m => m.SomeBooleanProperty, new { @checked = "checked" });

相反,在您的GET Action方法中,需要执行以下操作:

model.SomeBooleanProperty = true;

即使模型无效(即发布表单时出现一些错误),上述内容也会保留您的选择(如果您取消选中该框)。

但是,下面的代码肯定会生成一个选中的复选框,但不会保留您的未选中响应,而是在每次表单错误时都选中该复选框。

 @Html.CheckBox("SomeBooleanProperty", new { @checked = "checked" });

更新

//Get Method
   public ActionResult CreateUser(int id)
   {
        model.SomeBooleanProperty = true;         
   }

上面的代码会在开始时生成一个选中的复选框,并且即使在表单错误的情况下也会保留您的选择。

于 2013-09-05T14:21:54.763 回答
8

我在使用 ASP.NET MVC 5 时遇到问题,即使我的模型显然将值设置为 true,CheckBoxFor 也不会检查服务器端验证失败的复选框。我的 Razor 标记/代码如下所示:

@Html.CheckBoxFor(model => model.MyBoolValue, new { @class = "mySpecialClass" } )

为了使它起作用,我不得不将其更改为:

@{
    var checkboxAttributes = Model.MyBoolValue ?
        (object) new { @class = "mySpecialClass", @checked = "checked" } :
        (object) new { @class = "mySpecialClass" };
}
@Html.CheckBox("MyBoolValue", checkboxAttributes)
于 2014-07-01T17:17:48.223 回答
8

把它放在你的模型上:

[DisplayName("Electric Fan")]
public bool ElectricFan { get; set; }

private string electricFanRate;

public string ElectricFanRate
{
    get { return electricFanRate ?? (electricFanRate = "$15/month"); }
    set { electricFanRate = value; }
}

这在你的cshtml中:

<div class="row">
    @Html.CheckBoxFor(m => m.ElectricFan, new { @class = "" })
    @Html.LabelFor(m => m.ElectricFan, new { @class = "" })
    @Html.DisplayTextFor(m => m.ElectricFanRate)
</div>

这将输出:

MVC 输出 如果您单击复选框或粗体标签,它将选中/取消选中该复选框

于 2014-11-09T21:53:05.183 回答
4

在 POST 上绑定时,上述答案均不适合我,直到我在 CSHTML 中添加以下内容

<div class="checkbox c-checkbox">
    <label>
        <input type="checkbox" id="xPrinting" name="xPrinting" value="true"  @Html.Raw( Model.xPrinting ? "checked" : "")>
        <span class=""></span>Printing
    </label>
</div>


// POST: Index

[HttpPost]
public ActionResult Index([Bind(Include = "dateInHands,dateFrom,dateTo,pgStatus,gpStatus,vwStatus,freeSearch,xPrinting,xEmbroidery,xPersonalization,sortOrder,radioOperator")] ProductionDashboardViewModel model)
于 2016-04-01T04:40:32.697 回答
1

我正在寻找从数据库中动态显示标签的解决方案,如下所示:

checkbox1 : Option 1 text from database
checkbox2 : Option 2 text from database
checkbox3 : Option 3 text from database
checkbox4 : Option 4 text from database

所以上述解决方案都不适合我,所以我这样使用:

 @Html.CheckBoxFor(m => m.Option1, new { @class = "options" }) 
 <label for="Option1">@Model.Option1Text</label>

 @Html.CheckBoxFor(m => m.Option2, new { @class = "options" }) 
 <label for="Option2">@Mode2.Option1Text</label>

这样当用户点击标签时,复选框将被选中。

可能它可以帮助某人。

于 2014-06-14T17:18:32.630 回答
1

我很难让它工作,并为任何想要/需要使用 FromCollection 的人添加了另一个解决方案。

代替:

@Html.CheckBoxFor(model => true, item.TemplateId) 

像这样格式化 html 助手:

@Html.CheckBoxFor(model => model.SomeProperty, new { @class = "form-control", Name = "SomeProperty"})

然后在您的逻辑所在的视图模型/模型中:

public void Save(FormCollection frm)
{   
    // to do instantiate object.

    instantiatedItem.SomeProperty = (frm["SomeProperty"] ?? "").Equals("true", StringComparison.CurrentCultureIgnoreCase);

    // to do and save changes in database.
}
于 2016-07-27T09:38:58.893 回答