为什么 Html.Checkbox(“Visible”) 在 MVC 2 ASP.NET 返回“true, false”

本文关键字:NET ASP false 返回 true Checkbox Html Visible 为什么 MVC | 更新日期: 2023-09-27 17:55:48

我正在使用Html.Checkbox("Visible")向用户显示复选框。在回发中,FormCollection["Visible"]值为"真、假"。为什么?

在视图:

<td>                
    <%: Html.CheckBox("Visible") %>
</td>

在控制器中:

 adslService.Visible = bool.Parse(collection["Visible"]);

为什么 Html.Checkbox(“Visible”) 在 MVC 2 ASP.NET 返回“true, false”

这是因为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.
    ...

与其使用FormCollection我建议您使用视图模型作为操作参数或直接标量类型,而是将解析的麻烦留给默认模型绑定器:

public ActionResult SomeAction(bool visible)
{
    ...
}

我最近处理了这个问题,并提出了一种绕过 MVC 绑定并在查询字符串上使用 Contains("true") 的方法。没有其他东西对我有用。

如果人们坚持其他答案,那么这就是对我有用的 - https://web.archive.org/web/20140107134435/http://websitesorcery.com/post/2012/03/19/CheckBox-Issue-with-MVC-3-WebGrid-Paging-Sorting.aspx

如果你想/需要使用FormCollection,而不是检查truefalse,检查true,falsefalse

例如,代替这个

adslService.Visible = bool.Parse(collection["Visible"]);

这样做

adslService.Visible = bool.Parse(collection["Visible"] != "false");

我遇到了同样的问题。 我用以下组合修复了它(在达林·迪米特洛夫的帮助下 - 谢谢):

视图:

<label for="optIn"><%=Html.CheckBox("optIn", ViewData["OptIn"])%>

控制器:

public ActionResult Index()
{
   ViewData["Optin"] = True;
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(FormCollection form, bool OptIn )
{        
    ViewData["Optin"] = OptIn;
}
以下是实际选中

和未实际选中复选框的控件的来源(供参考):

检查:

<input Length="4" checked="checked" id="optIn" name="optIn" type="checkbox" value="true" /><input name="optIn" type="hidden" value="false" />

猖獗:

<input Length="4" id="optIn" name="optIn" type="checkbox" value="true" /><input name="optIn" type="hidden" value="false" />

所以,以下是我对这种行为的解释:

如果未选中该复选框,HTML 将不会回发字段值,但如果选中,则会回发。 帮助程序在复选框控件(值为"False")之后追加一个隐藏字段。 如果选中该复选框,则源显示"选中 = '选中'"如果未选中,则不会显示。 因此,如果选中 = 选中,则 true 将传递回控制器。 如果未选中该框,则不会将控件传递回去,因此名为相同的隐藏字段将接管并传回 false。 这样你就可以同时具备这两个条件。 奇怪,但它有效。 我希望这有所帮助。

我在 MVC 4 中遇到了同样的问题,

这个解决方案对我有用。

我的(窗体)视图:

@Html.EditorFor(m =>  m.SomeBoolValue)

用于在复选框为真时取消重复的"真,假"值

我将复选框参数存储在一个数组中:

var arrParams = Request.Form["SomeBoolValue"].Split(',');

抓住第一个元素:

string sParam = arrParams[0].ToString();

解析它:

bool BoolValue = bool.Parse(sParam);

保持它:

MyObject.SomeBoolValue = BoolValue;

MVC Entension的默认行为 Html.Checkbox 会生成一个隐藏字段以及要发布的字段。就我而言,因为我添加到页面的自定义复选框不像 Html.CheckBoxFor 那样绑定模型,所以我决定将其设置为简单的 html 复选框。

<input type="checkbox" name="WithAttachment" checked="checked"/> Include Attachments

这听起来可能很愚蠢,但比起下班后跑步,可以节省某人的时间。这将阻止使用 MVC 扩展创建复选框

我已经有一个静态函数,我在任何地方使用它来处理布尔类型文本并返回 true 或 false 作为布尔值,所以我只是在那里处理它

            if (sBool.StartsWith("true,")) bReturn = true;//cater for mvc checkboxes
            else if (sBool == "true") bReturn = true;
            else if (sBool == "t") bReturn = true;//t-f
            else if (sBool == "1") bReturn = true;//1-0
            else if (sBool == "yes") bReturn = true;//yes-no
            else if (sBool == "y") bReturn = true;//y-n
            else if (sBool == "on") bReturn = true;//on-off