如何使用FormCollection收集多个复选框值?

时间:2012-04-24 16:20:19

标签: c# asp.net-mvc asp.net-mvc-3 c#-4.0

根据Darin对我的问题Ho to display multiple checkbox selection based on user's selection from dropdown?的回答 我根据下拉选择显示多个复选框。

现在,一旦用户发布我在页面上的表单(有多个输入),我就会使用FormCollection收集所有数据。我遇到的问题是如何从formcollection中提取所选的复选框值?复选框的数量将根据下拉菜单的不同选择而改变,因此我认为请求每个复选框值都不起作用。

任何人都可以帮我解决这个问题。

流程如下所示:

模型中的属性

public class Subcategory
{
    public string Name { get; set; }
    public int ID { get; set; }
    public bool Flag { get; set; }
}

在实际视图中显示PartialView,其中包含其他表单输入:

 <div id="checkboxlist">
      @if (Model.SubCategories != null)
      {
           @Html.Partial("SubCategories", Model.SubCategories)
      }
 </div>    

PartialView SubCategories.cshtml

@model IEnumerable<MyProject.Entities.Subcategory>
@{
// we change the HTML field prefix so that input elements
// such as checkboxes have correct names in order to be able
// to POST the values back 
ViewData.TemplateInfo.HtmlFieldPrefix = "checkboxlist";
}
<span>subcategory</span>
<div id="subcategories" style="margin-left: 130px;margin-top: -20px;" data-role="fieldcontain">
   <fieldset data-role="controlgroup">
      @Html.EditorForModel()
   </fieldset>
</div> 

EditorTemplates Subcategory.cshtml

@model MyProject.Entities.Subcategory
<div class="editor-label">
   @Html.CheckBoxFor(c => c.Flag, new { type = "checkbox" })
   <label for="@Model.ID">@Model.Name</label>
   @Html.HiddenFor(c => c.Flag)
   @Html.HiddenFor(c => c.ID)
   @Html.HiddenFor(c => c.Name)
</div>

jquery根据下拉选择显示复选框:

 $('#Category').change(function () {
    var subcategoriesUrl = $(this).data('subcategoriesurl');
    var categoryId = $(this).val();
    $('#checkboxlist').load(subcategoriesUrl, { category: categoryId });
 });

1 个答案:

答案 0 :(得分:1)

请勿使用FormCollection。这是弱打字的。使用视图模型。像这样:

[HttpPost]
public ActionResult Foo(MyViewModel model)
{
    // model.BusinessSubCategories should contain a list of Subcategory
    // where for each element you could use the Flag property to see if
    // it was selected or not
    ...
}

另请注意,您在部分字段中使用的字段前缀之间存在不一致:

ViewData.TemplateInfo.HtmlFieldPrefix = "checkboxlist";

和视图模型集合属性:Model.BusinessSubCategories。因此,如果您希望默认模型绑定器能够在回发时填充此属性,请确保修复前缀以使用正确的属性名称。