在'之内的下拉列表循环不发布值

时间:2016-01-25 15:50:37

标签: c# asp.net-mvc model-view-controller razor

我有多个下拉列表,这些下拉列表使用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循环中遇到了与boble复选框相同的问题。

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

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

我的视图模型如下所示:

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

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

2 个答案:

答案 0 :(得分:3)

我发现了这个问题,即dropdownlistfor,checkboxlistfor等不喜欢在&#39;之内进行操作。环。我当然不具备理解原因的技术诀窍,但是当我将dropdownlist更改为dropdownlist时,它确实有效。所以解决方案看起来像这样:

@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))
     ...
      }
     }

答案 1 :(得分:0)

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