我正在处理从代码加载多个单选按钮组的页面。它可以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;}
}
答案 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 ,您不需要像上面那样操作字段名称。