正确使用.net MVC Html.CheckBoxFor

我想知道的是ASP.NET MVC中的Html.CheckBoxFor HTML助手的正确语法。

我试图完成的是用一个ID值初始检查checkbox,所以我可以在控制器中引用它来查看它是否仍然被选中。

下面是正确的语法?

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

这不是正确的语法

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

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

第一个参数必须标识模型中的布尔属性(它是一个expression式不是返回值的匿名方法),第二个属性定义了任何额外的HTML元素属性。 我不是100%肯定上述属性会初步检查您的checkbox,但您可以尝试。 但要小心。 即使它可能工作,稍后可能会有问题,加载有效的模型数据时,该特定的属性设置为false

正确的方法

虽然我的build议是将初始化模型提供给你的视图,该特定的布尔属性被初始化为true

物业types

根据Asp.net MVC的HtmlHelper扩展方法和内部工作,checkbox需要绑定到布尔值,而不是整数似乎你想做的事情。 在这种情况下,一个隐藏的字段可以存储该id

其他帮手

当然还有其他帮助器方法,可以用来获得有关checkbox值和行为的更大的灵活性:

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

注意checked 是一个HTML元素的布尔属性,而不是一个值属性,这意味着你可以给它分配任何值。 正确的HTML语法不包含任何赋值,但是没有办法提供一个具有未定义属性的匿名C#对象,该属性将呈现为HTML元素属性。

默认情况下,下面的代码不会生成一个选中的checkbox,因为模型属性会覆盖html属性:

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

相反,在您的GET操作方法中,需要完成以下工作:

 model.SomeBooleanProperty = true; 

上面的内容将保留你的select (如果你取消选中该框)即使模型无效(即发布表单时发生了一些错误)。

但是,下面的代码肯定会生成一个checkbox, 但不会保留您的取消选中的响应 ,而是每次在窗体中出现错误时都会对checkbox进行检查。

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

UPDATE

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

上面的代码会在开始时生成一个选中的checkbox,并且即使在表单中的错误也会保留您的select。

我有一个问题与ASP.NET MVC 5的CheckBoxFor不会检查我的checkbox在服务器端validation失败,即使我的模型显然有值设置为true。 我的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) 

把它放在你的模型上:

 [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输出 如果您点击checkbox或粗体标签,则会选中/取消选中checkbox

在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) 

我正在寻找解决scheme来显示标签dynamic从数据库是这样的:

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

所以没有上述解决scheme为我工作,所以我用这样的:

  @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> 

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

可能是可以帮助别人的。

我有麻烦得到这个工作,并为任何想要/需要使用FromCollection添加另一个解决scheme。

代替:

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

格式化html助手就像这样:

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

然后在viewmodel / model中,无论你的逻辑是:

 public void Save(FormCollection frm) { // to do instantiate object. instantiatedItem.SomeProperty = (frm["SomeProperty"] ?? "").Equals("true", StringComparison.CurrentCultureIgnoreCase); // to do and save changes in database. }