下拉列表在“for”循环中不发布值

本文关键字:布值 循环 for 下拉列表 | 更新日期: 2023-09-27 18:31:44

我有多个下拉列表,这些下拉列表使用 for 循环呈现,我在让它们将所选值发布到控制器时遇到问题。 在我的查询中,我的选择列表是这样的:

model.CreateGroupForm.Genders = new List<SelectListItem>
            {
                 new SelectListItem() {Text = "Either", Value = "Either"},
                new SelectListItem() {Text = "Male", Value = "Male"},
                new SelectListItem() {Text = "Female", Value = "Female"},
            };

的第一个问题甚至是让我的下拉列表显示数据库值,即使我确认它正在检索正确的值。 它不适用于这个:

@for (var c = 0; c < Model.ExistingGroups.Count; c++)
     {
      @using (Html.BeginForm("EditGroup", "Group", new { id = Model.Id.StripCollectionName(), slug = Model.Slug, innerid = Model.ExistingGroups[c].Id }, FormMethod.Post, new { id = "editcommunityteamform" + c.ToString(CultureInfo.InvariantCulture), @class = "nomarginbottom" }))                                    
      {
      ...
      @Html.DropDownListFor(x => x.ExistingGroups[c].Gender, Model.Createform.Genders)
     <button type="submit" class="btn btn-primary" title="Update name and description of this group">Update</button>
      }
     }

在对 Stack 进行一些挖掘后,我发现渲染的每个下拉列表都需要有自己单独的列表。 所以我把它改成:

 @Html.DropDownListFor(x => x.ExistingGroups[c].Gender,
new SelectList( Model.CreateGroupForm.Genders,"Value", "Text",Model.ExistingGroups[c].Gender))

然后,这会正确显示查询的值,但是当我提交表单时,它只会将 null 发布到控制器。 我在 for 循环中的布尔复选框上遇到了同样的问题。

控制器中的 ActionResult 只需要一个字符串值,如下所示:

public ActionResult EditGroup(EditGroupInput input)
    {
      var command = new EditGroupCommand(input.Gender);
      ....

我的视图模型如下所示:

public IList<CommunityGroup> ExistingGroups { get; set; }
public CreateGroupInput CreateGroupForm { get; set; }

然后上面的 2 个类具有代码中提到的属性。

下拉列表在“for”循环中不发布值

我发现了这个问题,即下拉列表、复选框列表等不喜欢在"for"循环中操作。 我当然没有技术知识来理解为什么,但是当我将下拉列表更改为下拉列表时,它起作用了。 所以解决方案看起来像这样:

@for (var c = 0; c < Model.ExistingGroups.Count; c++)
     {
      @using (Html.BeginForm("EditGroup", "Group", new { id = Model.Id.StripCollectionName(), slug = Model.Slug, innerid = Model.ExistingGroups[c].Id }, FormMethod.Post, new { id = "editcommunityteamform" + c.ToString(CultureInfo.InvariantCulture), @class = "nomarginbottom" }))                                    
      {
      ...
      @Html.DropDownList("Gender",  new SelectList(Model.CreateGroupForm.Genders, "Value", "Text", Model.ExistingGroups[c].Gender))
     ...
      }
     }

EditGroupInput 应该是现有组的集合,因为控制器操作方法与 view 紧密绑定。或者使用 formcollection 作为参数,并查看从视图发布到控制器的所有键是什么。