Asp.net mvc 正确使用.net MVC Html.CheckBoxFor

Asp.net mvc 正确使用.net MVC Html.CheckBoxFor,asp.net-mvc,checkboxfor,Asp.net Mvc,Checkboxfor,我只想知道ASP.NETMVC中Html.CheckBoxForHtml助手的正确语法 我试图完成的是,首先使用ID值检查复选框,以便我可以在控制器中引用它,查看它是否仍然被选中 下面是正确的语法吗 @foreach (var item in Model.Templates) { <td> @Html.CheckBoxFor(model => true, item.TemplateId) @Html.LabelFor(model

我只想知道ASP.NETMVC中
Html.CheckBoxFor
Html助手的正确语法

我试图完成的是,首先使用ID值检查复选框,以便我可以在控制器中引用它,查看它是否仍然被选中

下面是正确的语法吗

@foreach (var item in Model.Templates) 
{ 
    <td> 
        @Html.CheckBoxFor(model => true, item.TemplateId) 
        @Html.LabelFor(model => item.TemplateName)
    </td> 
}
@foreach(Model.Templates中的变量项)
{ 
@CheckBoxFor(model=>true,item.TemplateId)
@LabelFor(model=>item.TemplateName)
}
这不是正确的语法 第一个参数不是复选框值,而是查看复选框的模型绑定,因此:

@Html.CheckBoxFor(m => m.SomeBooleanProperty, new { @checked = "checked" });
第一个参数必须标识模型中的布尔属性(它不是返回值的匿名方法),第二个属性定义任何其他HTML元素属性。我不能100%确定上述属性最初是否会选中您的复选框,但您可以尝试。但是要小心。即使它可以工作,但在以后加载有效的模型数据时,您可能会遇到问题,并且该特定属性设置为
false

正确的方法 尽管我的建议是为视图提供初始化模型,并将特定的布尔属性初始化为
true

属性类型 根据Asp.net MVC
HtmlHelper
扩展方法和内部工作,复选框需要绑定到布尔值,而不是您希望执行的整数。在这种情况下,隐藏字段可以存储
id

其他助手 当然,您可以使用其他帮助器方法来获得关于复选框值和行为的更大灵活性:

@Html.CheckBox("templateId", new { value = item.TemplateID, @checked = true });
注意
选中
是HTML元素的布尔属性,而不是值属性,这意味着您可以为其指定任何值。正确的HTML语法不包含任何赋值,但无法提供具有未定义属性的匿名C#对象,该对象将呈现为HTML元素属性


默认情况下,当模型属性覆盖html属性时,以下代码不会生成复选框:

@Html.CheckBoxFor(m => m.SomeBooleanProperty, new { @checked = "checked" });
相反,在GET Action方法中,需要执行以下操作:

model.SomeBooleanProperty = true;
即使模型无效(即,过账表单时出现错误),上述内容仍将保留您的选择(如果您取消选中该框)

但是,下面的代码肯定会生成一个选中的复选框,但不会保留您的取消选中响应,而是每次在表单中出现错误时都选中该复选框

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


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

我正在寻找从数据库动态显示标签的解决方案,如下所示:

 @Html.CheckBox("SomeBooleanProperty", new { @checked = "checked" });
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>
因此,上述解决方案均不适用于我,因此我使用如下方式:

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>
@Html.CheckBoxFor(m=>m.Option1,新的{@class=“options”})
@Model.Option1Text
@CheckBoxFor(m=>m.Option2,新的{@class=“options”})
@模式2.Option1Text
这样,当用户单击标签时,将选中复选框


可能它可以帮助某人。

我在ASP.NET MVC 5中遇到问题,CheckBoxFor在服务器端验证失败时不会选中我的复选框,即使我的模型的值明显设置为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>

@CheckBoxFor(m=>m.ElectricFan,新的{@class=”“})
@LabelFor(m=>m.electrifan,新的{@class=”“})
@Html.DisplayTextFor(m=>m.ElectricFanRate)
将输出以下内容:


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

在绑定回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)

印刷
//职位:索引
[HttpPost]
公共操作结果索引([Bind(Include(Include=“dateInHands,dateFrom,dateTo,pgStatus,gpStatus,vwStatus,freeSearch,xPrinting,xembrodery,xPersonalization,sortOrder,radioOperator”)]ProductionDashboardViewModel模型)

我很难让它正常工作,为想要/需要使用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.
}

项目是您的模型的一部分还是什么?否。。。以下是HTML@foreach(Model.Templates中的var项){@HTML.CheckBoxFor(Model=>true,item.TemplateId)@HTML.LabelFor(Model=>item.TemplateName)中的完整代码}
CheckBoxFor()
(和
CheckBox()
)方法的目的是绑定到
bool
属性。由于
TemplateId
似乎不是
bool
,因此不要使用
CheckBoxFor()
-只需手动生成html,或者用mvc方式生成html-请参阅,非常感谢您向我解释。。。。看来这个html助手真的让我头疼。我接受了您的建议,将isChecked属性初始化为TRUE。
checked
应该是
@checked
Nice HOWTO on CheckBox()和CheckBoxFor():有一个问题。确保数据库中的字段不可为空,否则将出现问题!你救了我!我一直在我的bool上得到一个空引用,因为我在GET中未能初始化它。这看起来好像可以救我,但我无法将这些部分组合起来。当我的页面加载时,它会相应地显示复选框。当页面在回发时具有服务器端无效模型时,生成的页面不会显示