如何解决从@ Html.CheckBoxFor自动生成的隐藏表单字段

时间:2019-01-19 08:48:22

标签: c# asp.net-mvc razor

每当我在ASP.NET MVC模型中创建布尔属性并尝试使用@ Html.CheckBox创建复选框时,我都会自动生成一个隐藏的表单字段。我知道这是有原因的,但是每当我提交表单并使用表单集合获取该值时,它处于选中状态时都会返回2个值。它提交这样的值-'true,false'。现在,当我使用表单集合获取值并执行bool.Parse()时,由于无法将'true,false'一起解析而抛出错误。有什么办法可以摆脱隐藏的表单字段,还是在处理请求时尝试一下?

在模型中

[Display(Name ="Is Enabled")]
public bool IsEnabled { get; set; }

在控制器中

public ActionResult Request(FormCollection collection) 
{
   bool valueIsEnabled=bool.Parse(collection["IsEnabled"])                  
}

视图中

@Html.CheckBoxFor(m => m.IsEnabled, new { 
   @class = "custom-input"
})

当我单击选中时

预期结果-true 实际结果-正确,错误

当我不单击选中时

预期结果-假 实际结果-错误

1 个答案:

答案 0 :(得分:1)

好吧,我做了一些研究,发现CheckBox帮助器生成了一个与复选框同名的其他隐藏字段(您可以通过浏览生成的源代码来查看它):

<input checked="checked" id="Visible" name="Visible" type="checkbox" value="true" />
<input name="Visible" type="hidden" value="false" />

因此,当您提交表单时,这两个值都将发送到控制器操作。这是直接来自ASP.NET MVC源代码的注释,解释了此附加隐藏字段背后的原因:

if (inputType == InputType.CheckBox) {
    // Render an additional <input type="hidden".../> for checkboxes. This
    // addresses scenarios where unchecked checkboxes are not sent in the request.
    // Sending a hidden input makes it possible to know that the checkbox was present
    // on the page when the request was submitted.
    ...