正确使用.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>
哪个会输出这个:
如果您点击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. }