为啥 Html.Checkbox("Visible") 在 ASP.NET MVC 2 中返回“true, false”?

Posted

技术标签:

【中文标题】为啥 Html.Checkbox("Visible") 在 ASP.NET MVC 2 中返回“true, false”?【英文标题】:Why Html.Checkbox("Visible") returns "true, false" in ASP.NET MVC 2?为什么 Html.Checkbox("Visible") 在 ASP.NET MVC 2 中返回“true, false”? 【发布时间】:2011-08-21 14:50:53 【问题描述】:

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

在视图中:

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

在控制器中:

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

【问题讨论】:

【参考方案1】:

我已经有一个静态函数,我在任何地方都可以使用它来处理布尔类型文本并返回 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

【讨论】:

【参考方案2】:

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

&lt;input type="checkbox" name="WithAttachment" checked="checked"/&gt; Include Attachments

这可能听起来很傻,但比在工作后跑来跑去更能节省时间。这将阻止使用 MVC 扩展创建复选框

【讨论】:

我同意,这些框架让简单的事情变得复杂。【参考方案3】:

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

这个解决方案对我有用。

我的(表单)视图:

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

用于在 CheckBox 为 true 时取消重复的“true,false”值

我将 CheckBox 参数存储在一个数组中:

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

抓取第一个元素:

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

解析它:

bool BoolValue = bool.Parse(sParam);

保留它:

MyObject.SomeBoolValue = BoolValue;

【讨论】:

【参考方案4】:

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

例如而不是这个

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

这样做

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

【讨论】:

这个解决方案报错:“cannot convert 'bool' to 'string'” 应该是:adslService.Visible = collection["Visible"] != "false";【参考方案5】:

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

如果人们对其他答案感到困惑,那么这对我有用 - http://websitesorcery.com/post/2012/03/19/CheckBox-Issue-with-MVC-3-WebGrid-Paging-Sorting.aspx

【讨论】:

我也是这样做的。用复选框打发时间 谢谢,这很有帮助。【参考方案6】:

我有同样的问题。我用以下组合修复了它(在 Darin Dimitrov 的帮助下——谢谢):

查看:

<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”)。如果复选框被选中,则源显示“checked = 'checked'”,如果未选中,则不会出现。因此,如果checked = checked,则将true 传递回控制器。如果未选中该框,则不会传回控件,因此名称相同的隐藏字段接管并传回 false。这样你就有了这两个条件。奇怪但它有效。我希望这会有所帮助。

【讨论】:

【参考方案7】:

那是因为CheckBox helper 生成了一个与复选框同名的附加隐藏字段(您可以通过浏览生成的源代码看到它):

<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)

    ...

【讨论】:

浏览器负责发送或不发送复选框值来请求?为什么? 如果我直接在 View 中使用&lt;input type="checkbox" name="Visible" /&gt; 会怎样? @Jalal Amini,如果你想避免这个隐藏字段,你可以直接在视图中使用&lt;input type="checkbox" name="Visible" /&gt; +1 了解 Asp.Net MVC 底层发生的事情总是很有趣。 嗨,Darin 请看看这个类似的场景并提供答案***.com/questions/17294528/…。谢谢。

以上是关于为啥 Html.Checkbox("Visible") 在 ASP.NET MVC 2 中返回“true, false”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 "map! <C-q> :q <CR> " 在 vi​​m 中不起作用?

MVC Html.CheckBox 和表单提交问题

为啥 viewDidLoad 在 vi​​ewWillAppear 之前被调用? [复制]

为啥linux下输入ls命令看不到文件

为啥使用vi编辑器Linux打开时行折叠

linux 的vi编辑器为啥没有高亮显示?