【问题标题】:Html.checkbox control form collection values are getting with some extra true false valuesHtml.checkbox 控件表单集合值带有一些额外的真假值
【发布时间】:2013-08-29 18:32:36
【问题描述】:

这是我的查看页面标记

<%for (int i = 0; i < 3; i++)
  { %>


  <%:Html.CheckBox("Test") %>

<%} %>

这是我的控制器,我从 formcollection 对象中获取值

public ActionResult CreateTaxMaster(TaxMaster objTaxMaster ,bool [] Test,FormCollection form)
{ 
    string LocalCheckboxValues = string.Empty;
    foreach (var key in form.AllKeys)
    {
         if (key.Contains("Test"))
         {
              LocalCheckboxValues = LocalCheckboxValues + form.Get(key);                 
         }

}

我尝试了所有三种方法来获得正确的值,但它给了我一些真假值与复选框的选择值不匹配

如果我选择所有三个复选框,它仍然会给出 formcollection 值 真、假、真、假、真、假

如有任何帮助,我们将不胜感激。 提前致谢。

【问题讨论】:

标签: c# html asp.net-mvc checkbox


【解决方案1】:

MVC 渲染一个具有相同 ID 的隐藏复选框,因此我们得到了两个值。可见的是第一个,所以你可以使用逗号和拆分来得到它(如果只有一个值也可以):

bool ActualValue = Convert.ToBoolean(collection["BoolFieldName"].ToString().Split(',')[0]);

【讨论】:

    【解决方案2】:
    List<bool> bools = Request["Test"].Split(',').Select(n => string.Compare(n, "true", true) == 0? true : false).ToList();
    
    for (int i = 0; i < bools.Count(); ++i)
    {
        if (bools[i]) bools.RemoveAt(i + 1);
    }
    

    【讨论】:

    • 仅发布代码并不能做出好的回答。添加一些关于为什么这是正确代码的解释,以便其他人可以理解底层逻辑,避免类似问题,并调整代码以满足自己的需求。
    【解决方案3】:

    没有隐藏,只有选中的值会被发布。如果您使用 bool[] 作为参数,您将获得复选框和隐藏值。所以 false 给你一个条目,而 true 给你一个匹配的 false。

    Why does the CheckBoxFor render an additional input tag, and how can I get the value using the FormCollection?

        /// <summary>
        /// If you posted an array of checkboxes to a controller, this will extract the values you expect.
        /// </summary>
        /// <param name="arrayOfCheckboxesFromController">An array of checkboxes passed to the controller</param>        
        /// <remarks>with checkboxes, true values come with a twin false so remove it</remarks>
        private static void GetCheckboxArrayValues(IList<bool> arrayOfCheckboxesFromController)
        {
            for (var i = 0; i < arrayOfCheckboxesFromController.Count(); i++)
            {
                if (!arrayOfCheckboxesFromController[i]) continue;
    
                // This assumes the caller knows what they are doing and passed in an array of checkboxes posted to a controller
                arrayOfCheckboxesFromController.RemoveAt(i + 1);
            }
        }
    

    【讨论】:

      【解决方案4】:

      查看复选框被选中后会发生什么,生成隐藏字段以存储用于将其发送回服务器的错误值,然后我按照以下顺序处理这种情况,我删除了下一个元素表单集合对象,即隐藏字段的值。如下

      if(Convert.ToBoolean(form["Test"])== true){form["Test"].RemoveAt(i+1)}
      

      【讨论】:

        【解决方案5】:

        这是因为当复选框被选中时,传递的值为“真,假”

        使用Contains("true");可以检查复选框是否被选中

        例如:

        bool bChecked = form[key].Contains("true");

        【讨论】:

        • 嗨,我尝试在控件中声明同名控件作为参数仍然给出相同的结果
        猜你喜欢
        • 2013-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-10
        • 2015-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多