我想知道的是ASP.NET MVC中Html.CheckBoxFor
HTML帮助程序的正确语法。
我想要完成的是最初使用ID值检查复选框,以便我可以在Controller中引用它以查看它是否仍然被检查。
下面是正确的语法吗?
@foreach (var item in Model.Templates)
{
<td>
@Html.CheckBoxFor(model => true, item.TemplateId)
@Html.LabelFor(model => item.TemplateName)
</td>
}
答案 0 :(得分:111)
第一个参数是不是复选框值,而是查看复选框的模型绑定:
@Html.CheckBoxFor(m => m.SomeBooleanProperty, new { @checked = "checked" });
第一个参数必须标识模型中的布尔属性(它是Expression而不是返回值的匿名方法),第二个属性定义任何其他HTML元素属性。我不是100%确定上述属性最初会检查您的复选框,但您可以尝试。但要注意。即使它可能有效,但在加载有效模型数据并且该特定属性设置为false
时,您可能会遇到问题。
虽然我的正确建议将为您的视图提供已初始化的模型,并将该特定布尔属性初始化为true
。
根据Asp.net MVC HtmlHelper
扩展方法和内部工作,复选框需要绑定到布尔值而不是整数似乎你想要做的事情。在这种情况下,隐藏字段可以存储id
。
当然,您可以使用其他辅助方法来获得有关复选框值和行为的更大灵活性:
@Html.CheckBox("templateId", new { value = item.TemplateID, @checked = true });
注意 :
checked
是HTML元素布尔属性,而不是值属性,这意味着您可以为其分配任何值。正确的HTML语法不包含任何赋值,但是没有办法提供具有未定义属性的匿名C#对象,该属性将呈现为HTML元素属性。
答案 1 :(得分:16)
默认情况下,以下代码将 NOT 生成选中的复选框,因为模型属性会覆盖html属性:
@Html.CheckBoxFor(m => m.SomeBooleanProperty, new { @checked = "checked" });
相反,在 GET操作方法中,需要执行以下操作:
model.SomeBooleanProperty = true;
以上将保留您的选择(如果您取消选中该框),即使模型无效(即发布表单时发生错误)。
但是,以下代码肯定会生成一个选中的复选框,但不会保留取消选中的回复,而是每次在表单中出现错误时都会选中复选框。
@Html.CheckBox("SomeBooleanProperty", new { @checked = "checked" });
<强>更新强>
//Get Method
public ActionResult CreateUser(int id)
{
model.SomeBooleanProperty = true;
}
上面的代码会在启动时生成一个选中的复选框,即使表单中存在错误,也会保留您的选择。
答案 2 :(得分: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)
答案 3 :(得分:6)
将其放在您的型号上:
[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>
哪个会输出:
如果单击复选框或粗体标签,将选中/取消选中复选框
答案 4 :(得分: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)
答案 5 :(得分: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>
这样,当用户点击标签时,将选中复选框。
可能它可以帮助某人。
答案 6 :(得分:1)
我无法让这个工作,并为想要/需要使用FromCollection的人添加了另一个解决方案。
而不是:
@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.
}