表单复选框组不将所有值发送到Controller

时间:2016-02-18 00:17:31

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

如果我的表单中有Checkbox代码并且已提交给Controller,则只会发送FIRST复选框值,并忽略所有其他选中的值。

表单的示例块:

<text>
    <text> text1 </text>
    <text> text2 </text>
</text>

提交给Controller后:

  • 如果选中手机和电子邮件,“Model.commPref”=“24”-NOT-“24,26”
  • 如果选中工作电话,电子邮件和邮件,“Model.commPref”=“工作”-NOT-“工作,26,27”

我对此完全感到困惑。表单复选框周围是否需要额外的代码才能将值组合在一起?在ColdFusion中,发回的表单值是已检查值的完整字符串。表单控件的“名称”都是相同的(commPref),因此这应该是此字段的结果值。

修改:这是型号说明:

@:<input type="checkbox" name="commPref" value="23" />Home Phone
@:<input type="checkbox" name="commPref" value="24" />Cell Phone
@:<input type="checkbox" name="commPref" value="Work" />Work Phone
@:<input type="checkbox" name="commPref" value="26" />Email
@:<input type="checkbox" name="commPref" value="27" />Mail

2 个答案:

答案 0 :(得分:0)

感谢这篇文章中所有评论者的帮助,最终解决了我的情况:

控制器:

    [HttpPost]
    public ActionResult form(form_Data form_data, IEnumerable<string> commPref)
    {
        if (ModelState.IsValid) // Perform DB Actions
        {
            // Checkbox Object Loop - commPref field
            // Loop through each string array element of form field to build resulting field value
            if (form_data.commPref != null)
            {
                //Code to make comma-delimited list of Checkbox choices
                //form_data.commPref = string.Join(",", commPref);
                //Wraps each Checkbox choice in pipes (|) to strictly define choice for display on form
                form_data.commPref = "|";
                foreach (var item in commPref)
                {
                    form_data.commPref += item;
                    form_data.commPref += "|";
                }
            }

            if (form_data.dataID != 0) // Edit Record
            {
                db.Entry(form_data).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index", new { msg = 2 });
            }
            else // Create Record
            {
                db.formapp_Data.Add(form_data);
                db.SaveChanges();
                return RedirectToAction("Index", new { msg = 1 });
            }

        }
        else // Show Errors
        {
            var errors = ModelState.Values.SelectMany(v => v.Errors);
            return View();
        }
    }

答案 1 :(得分:0)

我知道这一定是疯狂的迟到但只是让其他人发现自己在这里..

MVC确实有办法处理复选框组。

在您的视图模型中:

[显示(姓名=&#34;接受哪些信用卡:&#34;)]

public string [] EmployeeRoles {get;组; }

在您的页面上:

            <input id="EmployeeRoles" name="EmployeeRoles" type="checkbox" value="Supervisor" 
            @(Model.EmployeeRoles != null && Model.EmployeeRoles.Contains("Supervisor") ? "checked=true" : string.Empty)/>
            &nbsp;<span>Supervisor</span><br />

            <input id="EmployeeRoles" name="EmployeeRoles" type="checkbox" value="Auditor" 
            @(Model.EmployeeRoles != null && Model.EmployeeRoles.Contains("Auditor") ? "checked=true" : string.Empty)/>
            &nbsp;<span>Auditor</span><br />

            <input id="EmployeeRoles" name="EmployeeRoles" type="checkbox" value="Administrator" 
            @(Model.EmployeeRoles != null && Model.EmployeeRoles.Contains("Administrator") ? "checked=true" : string.Empty) />
            &nbsp;<span>Administrator</span>

我非常努力地用剃刀创建这些控件,但没有骰子。它使 创建你所提到的那个隐藏的领域。为您的复选框组 你不需要那个隐藏的领域,只需要我上面添加的代码。您可以创建一个html帮助程序来为您创建此代码。

    public static HtmlString CheckboxGroup<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> propertySelector, Type EnumType)
    {
        var groupName = GetPropertyName(propertySelector);
        var modelValues = ModelMetadata.FromLambdaExpression(propertySelector, htmlHelper.ViewData).Model;//propertySelector.Compile().Invoke(htmlHelper.ViewData.Model);

        StringBuilder literal = new StringBuilder();  

        foreach (var value in Enum.GetValues(EnumType))
        {
            var svalue = value.ToString();
            var builder = new TagBuilder("input");
            builder.GenerateId(groupName);
            builder.Attributes.Add("type", "checkbox");
            builder.Attributes.Add("name", groupName);
            builder.Attributes.Add("value", svalue);
            var contextValues = HttpContext.Current.Request.Form.GetValues(groupName);
            if ((contextValues != null && contextValues.Contains(svalue)) || (modelValues != null && modelValues.ToString().Contains(svalue)))
            {
                builder.Attributes.Add("checked", null);
            }

            literal.Append(String.Format("</br>{1}&nbsp;<span>{0}</span>", svalue.Replace('_', ' '),builder.ToString(TagRenderMode.Normal)));
        }

        return (HtmlString)htmlHelper.Raw(literal.ToString()); 
    }

    private static string GetPropertyName<T, TProperty>(Expression<Func<T, TProperty>> propertySelector)
    {
        var body = propertySelector.Body.ToString();
        var firstIndex = body.IndexOf('.') + 1;
        return body.Substring(firstIndex);
    }
在您的页面上

使用它如下: @ Html.CheckboxGroup(m =&gt; m.EmployeeRoles,typeof(Enums.EmployeeRoles))

我使用枚举但您可以使用任何类型的集合