【问题标题】:MVC - How to submit two sets of multiple check boxes to controller action?MVC - 如何将两组多个复选框提交给控制器操作?
【发布时间】:2025-12-02 00:10:01
【问题描述】:

我在一个表单中有两组复选框,它们几乎都与此相同:

<input type="checkbox" value="1" name="Test Course"
    checked="checked" />Test Course
<input type="checkbox" value="2" name="Test Course 2" />Test Course 2
<input type="checkbox" value="3" name="Test Course 3" />Test Course 3

表单是通过 Razor 生成的。代码如下:

@using (Html.BeginForm("Save", "Material",
        new { id = Model.Material.FirstOrDefault().ID },
        FormMethod.Get, new { id = "associationForm" })
{
    <h3>@Model.Material.FirstOrDefault().Title</h3>
    Html.RenderPartial("Association/_Course", Model);
    Html.RenderPartial("Association/_Track", Model);
    <br />
    <input type="submit" value="Save" />
}

复选框是通过您在表单中看到的两个局部视图呈现的。

目前,唯一提交成功的数据是@using() {}语句第二行参数中的new { id = Model.Material.FirstOrDefault().ID }

我需要将两组复选框作为集合提交,以便我可以遍历它们并执行一些数据库操作。我以前从未做过这样的事情,唯一阻止我的是这些复选框。

如何将这些值作为两个单独的集合提交?

【问题讨论】:

    标签: html asp.net-mvc forms razor


    【解决方案1】:

    为此,您必须渲染一个集合。我假设您的模型中有两个集合,一个称为 Courses,一个称为 Tracks。

    @for(int i = 0; i < collection.Count(); i++ {
        // Boolean property indicating value is selected on your Courses view model submodel
        Html.CheckBoxFor(model => model.Courses[i].CourseSelected); 
        Html.Raw(Model.Courses[i].CourseName);
    }
    

    然后对您的曲目执行相同的操作。

    编辑;

    假设您有一个带有 List&lt;Course&gt; 的 ViewModel,其中 Course 如下所示:

    public class Course {
        public bool CourseSelected {get;set;}
        public string CourseName {get;set;}
    }
    

    您必须根据复选框集合的索引查找课程。因此,如果设置了 Course[0],则需要根据位置获取第一门课程。您也可以按名称查找它,但您必须包含一个隐藏字段以允许将其发布回包含该名称的表单。否则,您将 CourseName 为空,您将只使用布尔绑定的数组。

    【讨论】:

    • @keyCrumbs - Razor 助手的存在是有原因的,他们确保以正确的格式呈现模型绑定。
    • @keyCrumbs - 我现在无法测试此代码,Razor 可能对在某些地方使用 @ 符号和使用分号有点挑剔......玩弄它。
    • @KeyCrumbs - 不,它显然不是一个 int,尽管我确实把它命名得很糟糕。称它为 CourseSelected 或任何你想要的,但它应该是一个布尔值。我认为这应该很明显,因为复选框是一个布尔值。
    【解决方案2】:

    好的,我认为您需要同一组中输入的名称属性相同,加上方括号,例如“checkgroup1[]”

    <input type=checkbox name=checkgroup1[] value=1> 
    <input type=checkbox name=checkgroup1[] value=2> 
    

    【讨论】:

      【解决方案3】:

      如果您在视图中定义了两组复选框,但名称不同,例如:

      <input type=checkbox name=checkgroup1[] value="x"> 
      .
      .
      .
      <input type=checkbox name=checkgroup2[] value="y"> 
      .
      .
      .
      

      你可以像这样在控制器上声明你的 post 方法:

      [HttpPost]
      public ActionResult YourAction(YourModel model, string[] checkgroup1, params string[] checkgroup2) 
      {
      ...
      }
      

      【讨论】:

        最近更新 更多