Asp.net MVC多个单选按钮组

时间:2016-01-11 22:08:01

标签: c# asp.net-mvc radio-button

enter image description here

我正在处理从代码加载多个单选按钮组的页面。它可以2,3,4 ....所以每个单选按钮组可以包含一个或多个单选按钮,如图所示。

工作流程是用户选择一个单选按钮,下面的网格会在点击越来越多的单选按钮时过滤结果,网格结果会减少,直到用户得到他想要的结果。

我需要捕获在Controller操作中单击的所有单选按钮。

public ActionResult index(IEnumerable<string> selectedRadioButtons)
{
}

这似乎不起作用。知道如何实现这一点。

模型

public class Person
{
     public string Name {get;set;}
     public IEnumerable<FavoriteGroup> Favorites {get;set;}
}

public class FavoriteGroup
{
    public string GroupName {get;set;}
    public IEnumerable<KeyValuePair> Options {get;set;}
}

enter image description here

1 个答案:

答案 0 :(得分:2)

只要您操作表单字段名称以匹配您的视图模型属性/层次结构,它就可以工作。

让我们为您的FavoriteGroup类添加一个新属性,以存储所选的单选按钮值。

public class FavoriteGroup
{
    public string GroupName { get; set; }
    public IEnumerable<KeyValuePair<int, string>> Options { get; set; }
    public int SelectedAnswer { set; get; }
}

在您看来,

@model YourNameSpaceHere.Person
@using (Html.BeginForm())
{
    var qCounter = 0;

    foreach (var favoriteGroup in Model.Favorites)
    {    
        <h4>@favoriteGroup.GroupName</h4>

        @Html.HiddenFor(f => f.Name)
        foreach (var option in favoriteGroup.Options)
        {
            @Html.Hidden("Favorites[" + qCounter + "].GroupName", favoriteGroup.GroupName)

            @Html.RadioButton("Favorites[" + qCounter + "].SelectedAnswer", option.Key)
            <span>@option.Value</span>

        }
        qCounter++;
    }    
    <input type="submit" />
}

假设您正在发送一个有效的Person对象,其中的属性填充了一些数据。

你的HttpPost动作方法将是,

[HttpPost]
public ActionResult Index(Person vm)
{
    foreach (var group in vm.Favorites)
    {
        var groupName = group.GroupName;
        var selected = group.SelectedAnswer;
       //do something with these 
    }
   // to do : Return something
}

另一个解决方案是使用 EditorTemplates ,您不需要像上面那样操作字段名称。