我需要在表单中有多个单选按钮组,如下所示:
我知道通过为每个组指定相同的“ name ”html属性来完成它。
的无论其
使用html helper时,MVC不允许您指定自己的name属性:
@Html.RadioButtonFor(i => item.id, item.SelectedID, new { Name = item.OptServiceCatId })
因为它会查看每个标记的“名称”属性(而不是“ id ”)以将表单映射/绑定到模型控制器收到等等。
有人说用相同的“GroupName”属性指定每个都会解决问题,但它也不起作用。
那么,有什么方法可行吗?
修改
这是我的观点(简化):
@model Service_Provider.ViewModels.SelectOptServicesForSubServiceViewModel
@foreach (var cat in Model.OptServices)
{
//A piece of code & html here
@foreach (var item in cat.OptItems.Where(i => i.MultiSelect == false))
{
@Html.RadioButtonFor(i => item.id, item.SelectedID, new { GroupName = item.OptServiceCatId })
<br />
}
}
注意:
我的模型是List<OptServices>
:
public List<OptServices> Cats {get; set;}
OptServices里面有List
OptItems
:
public class OptServices
{
//a few things
public List<OptItems> Items {get; set;}
}
答案 0 :(得分:28)
您只需将组绑定到模型中的其他项目
即可@Html.RadioButtonFor(x => x.Field1, "Milk")
@Html.RadioButtonFor(x => x.Field1, "Butter")
@Html.RadioButtonFor(x => x.Field2, "Water")
@Html.RadioButtonFor(x => x.Field2, "Beer")
答案 1 :(得分:18)
好的,这是我如何解决这个问题
我的模型是类别的list
。每个类别都包含{<1>}个子类别
考虑到这一点,每次在foreach循环中,每个list
都会将其类别的ID(这是唯一的)作为其名称属性。
我还使用RadioButton
代替Html.RadioButton
。
这是最终的'工作'伪代码:
Html.RadioButtonFor
结果是:
@foreach (var cat in Model.Categories)
{
//A piece of code & html here
@foreach (var item in cat.SubCategories)
{
@Html.RadioButton(item.CategoryID.ToString(), item.ID)
}
}
请注意,我没有将所有这些单选按钮组放在表单中。而且我不知道这个解决方案是否仍然可以在表单中正常工作。
感谢所有帮助我解决此问题的人;)
答案 2 :(得分:3)
我修复了一个类似的问题,用SelectList中的文本/值对构建一个RadioButtonFor。我使用ViewBag将SelectList发送到View,但您也可以使用模型中的数据。我的网络应用程序是一个博客,我必须在撰写新帖子时用一些类型的文章构建一个RadioButton。
下面的代码很简单。
List<SelectListItem> items = new List<SelectListItem>();
Dictionary<string, string> dictionary = new Dictionary<string, string>();
dictionary.Add("Texto", "1");
dictionary.Add("Foto", "2");
dictionary.Add("Vídeo", "3");
foreach (KeyValuePair<string, string> pair in objBLL.GetTiposPost())
{
items.Add(new SelectListItem() { Text = pair.Key, Value = pair.Value, Selected = false });
}
ViewBag.TiposPost = new SelectList(items, "Value", "Text");
在视图中,我使用foreach来构建一个radiobutton。
<div class="form-group">
<div class="col-sm-10">
@foreach (var item in (SelectList)ViewBag.TiposPost)
{
@Html.RadioButtonFor(model => model.IDTipoPost, item.Value, false)
<label class="control-label">@item.Text</label>
}
</div>
</div>
请注意,在提交表单后,我使用 RadioButtonFor 来捕获用户在Controler中选择的值选项。我还必须将item.Text放在RadioButtonFor之外,以显示文本选项。
希望它有用!
答案 3 :(得分:0)
您可以使用词典进行映射 假设牛奶,黄油,奶酪是A组(ListA) 水,啤酒,葡萄酒是B组
Dictonary<string,List<string>>) dataMap;
dataMap.add("A",ListA);
dataMap.add("B",ListB);
在View中,您可以在dataMap中预览Keys并处理您的操作
答案 4 :(得分:0)
我能够将您在示例中描述的name属性用于正在处理的循环,并且该循环有效,也许是因为我创建了唯一的ID?我仍在考虑是否应该切换到编辑器模板,而不是在另一个答案中的链接中提到。
@Html.RadioButtonFor(modelItem => item.Answers.AnswerYesNo, "true", new {Name = item.Description.QuestionId, id = string.Format("CBY{0}", item.Description.QuestionId), onclick = "setDescriptionVisibility(this)" }) Yes
@Html.RadioButtonFor(modelItem => item.Answers.AnswerYesNo, "false", new { Name = item.Description.QuestionId, id = string.Format("CBN{0}", item.Description.QuestionId), onclick = "setDescriptionVisibility(this)" } ) No