【问题标题】:How to get checkbox value from FormCollection?如何从 FormCollection 中获取复选框值?
【发布时间】:2015-05-13 06:30:43
【问题描述】:

我有一个复选框和按钮:

@using(Html.BeginForm())
{
    <div id="search-block">
        <input type="checkbox" name="showAll" id="showAll">Include completed
        <input type="submit" value="Apply"/>
    </div>
}

控制器中的第二件事:

[HttpPost]
public ActionResult Index(FormCollection collection)
{
    var showAll = collection["showAll"];
    TempData["showAll"] = showAll;

    ... 
    something
    ...
}

它确实有效,但是:

如果未选中复选框,我将收到 null (不会打扰我)。

如果选中复选框,我会收到来自FormCollection 的“开启”,这不是我需要的。我想收到真假。

我该怎么做?

【问题讨论】:

  • 您可以在表单中放置一个同名且值为“false”的隐藏字段。 那么如果他们不选中该框,则表单中发布的值将为假。如果他们选中它,您将得到“on,false”,但您可以在你的控制器中解决这个问题 bool x = (collection["showAll"] == 'false')
  • 这样的玩笑吗?
  • 不-如果您查看某些框架如何处理复选框的背景,您会发现这样做的隐藏字段-它确保将某些内容发布到服务器
  • 无论我怎么看你的话,我都看不到你确实阅读了这个问题的任何确认。
  • 您希望您的复选框发布真假。为此,您需要将 value=True 放入复选框输入标签中。为了在未选中复选框时将任何内容发布到服务器 - 您需要在表单中放置一个值为“false”的隐藏字段。这就是下面 Tashar 的回答中发生的事情,以及为什么您在表单集合中得到“真,假”的原因。您只需要查看第一个元素 - collection["showAll"].Split(',')[0]

标签: asp.net asp.net-mvc checkbox


【解决方案1】:
<input type="checkbox" name="showAll" id="showAll">Include completed

将发布"on""off" 的值。

这不会绑定到布尔值

要接收布尔值,您可以使用 HTML Helper Checkbox 喜欢

@Html.CheckBox("showAll")
<label for="showAll" style="display:inline">Include completed</label>

更新:

如果选中,html 助手将回发"true,false",如果 未选中为"false"

您可以使用此解决方法

bool MyBoolValue= Convert.ToBoolean(collection["showAll"].Split(',')[0]);

这是因为 Html 助手类添加了一个额外的 hidden 字段来保存复选框的状态

【讨论】:

  • 那么... 使用 html 助手应该是什么样子?可以写吗?
  • 好吧,我收到了真假...但是当复选框被选中时,我收到了“真假”。有没有办法把它们分开?
  • 至少我在选中复选框时收到错误消息。已经有东西了:D
  • @OlegsJasjko 已编辑,如果您绑定模型,我建议您使用 @HTML.CheckboxFor
  • 问题是,至少在这个页面上我没有使用模型。我不确定我是否决定使用 FormCollection 如果我有一个模型 :D。会尝试你的答案。谢谢。
【解决方案2】:

我无法让它工作,这是我想出的解决方案。我用一个 html 助手来展示它。

@Html.CheckBoxFor(model => model.showAll, new { @class = "form-control", Name = "showAll"})

这是我不断跌倒的地方,以下工作。

bool MyBoolValue= (collection["showAll"] ?? "").Equals("true", StringComparison.CurrentCultureIgnoreCase);

【讨论】:

    【解决方案3】:

    我已经尝试过输入标签,它的工作原理如下所示:

    <form method="post">
        <input type="checkbox" id="chkRmb" name="chkRmb" /> Remember Me?
        <input type="submit" value="Log In" class="btn btn-default login-btn" />
    </form>
    

    在控制器中,比较字符串值并将其转换为布尔值。

    bool rmbMe = (formdata["chkRmb"] ?? "").Equals("on", StringComparison.CurrentCultureIgnoreCase);
    

    【讨论】:

      【解决方案4】:

      所以我试了一下,它似乎很乐意接受它,其中 collection 是我的 FormCollection 对象:

      if (collection.AllKeys.Contains("Inactive"))
      {
           np.Inactive = false;
      }
      else
      {
          np.Inactive = true;
      }
      

      请注意,目标元素的名称令人困惑 - 但这是我寻求的预期结果。

      【讨论】:

        【解决方案5】:

        试试这个,它为我解决了同样的问题。以为我会分享它,以防其他人将来遇到这个问题。

        [HttpPost]
        public ActionResult Index(FormCollection collection)
        {
            Boolean tempValue = collection["showAll"] != null ? true : false;
            TempData["showAll"] = tempValue;
        
            ... 
            something
            ...
        }
        

        【讨论】:

          【解决方案6】:

          试试这个

          bool MyBoolValue= collection["showAll"].Count > 1;
          

          当为 1 时为假

          当 2 时为真

          【讨论】:

          • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
          猜你喜欢
          • 2012-02-19
          • 1970-01-01
          • 2011-04-19
          • 2011-02-06
          • 2010-12-15
          • 2018-07-24
          • 2014-02-13
          • 1970-01-01
          相关资源
          最近更新 更多