正确使用.net MVC Html.CheckBoxFor

时间:2012-10-01 13:47:27

标签: asp.net-mvc checkboxfor

我想知道的是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> 
}

7 个答案:

答案 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>

哪个会输出:

MVC Output 如果单击复选框或粗体标签,将选中/取消选中复选框

答案 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.
}