正确使用.net MVC Html.CheckBoxFor


78

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

我要完成的工作是使用ID值对复选框进行初始检查,以便我可以在Controller中对其进行引用以查看其是否仍处于选中状态。

下面是正确的语法吗?

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

item您模型的一部分还是什么?
罗伯特·科里特尼克

否...这是HTML @foreach中的完整代码(Model.Templates中的var项目){<td> @ Html.CheckBoxFor(model => true,item.TemplateId)@ Html.LabelFor(model => item。 TemplateName)</ td>}
sagesky36'1/

CheckBoxFor()(和CheckBox())方法的目的是绑定到bool属性。由于TemplateId似乎不是bool,请不要使用CheckBoxFor()-只需手动生成html,或以mvc方式进行操作-请参阅此答案

Answers:


126

那不是正确的语法

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

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

第一个参数必须标识模型中的布尔属性(这是一个Expression而不是返回值的匿名方法),第二个属性定义任何其他HTML元素属性。我不确定100%以上的属性会首先选中您的复选框,但是您可以尝试。但是要当心。即使它可能行得通,但稍后在加载有效的模型数据并将该特定属性设置为时可能会遇到问题false

正确的方法

尽管我的正确建议是使用初始化为的特定布尔属性为视图提供初始化的模型true

物业类型

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

其他帮手

当然,您还可以使用其他辅助方法来提高复选框值和行为的灵活性:

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

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


2
非常感谢您向我解释它。我听取了您的建议,并将isChecked属性初始化为TRUE。
sagesky36

3
checked应该是@checked
Kehlan Krumme 2013年

关于CheckBox()和CheckBoxFor()的不错的HOWTO:tutorialsteacher.com/mvc/htmlhelper-checkbox-checkboxfor
Wouter,

有一个陷阱。确保数据库中的字段不可为空,否则您将遇到问题
John Swaringen

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;         
   }

上面的代码将在启动时生成一个选中的复选框,并且即使在表单错误时也将保留您的选择。


谢谢!你救了我!我一直在布尔中获取空引用,因为我无法在GET中初始化它。
跳蚤

看起来这将挽救我,但我无法拼凑而成。当我的页面加载时,它会适当显示复选框。当页面在回发时具有服务器端无效模型时,即使模型的值为true,结果页面也不显示已选中的复选框。我不确定“ GET Action”是什么意思,除了可以在我的控制器中将其设置为true之外,但我已经在那里设置了true。知道我缺少什么吗?
Kirk Liemohn 2014年

我发布了一个对我有用的答案。不理想,但是我可以使用它。
Kirk Liemohn

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)

1
我遇到了同样的问题,就我而言,我可以使用ModelState.Clear。这是因为它使用的是回发值,而不是您在控制器中设置的值吗? weblog.west-wind.com/posts/2012/Apr/20/…–
托尼

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输出 如果单击复选框或粗体标签,它将选中/取消选中该复选框


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)

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>

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

可能会帮助某人。


1

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

代替:

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

像这样格式化html helper:

@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.
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.