asp.net mvc 4 - net - MĂșltiples grupos de botones de radio en MVC 4 Razor
radiobuttonfor mvc 5 (5)
Necesito tener múltiples grupos de botones de radio en mi forma de esta manera:
Sé que simplemente se hace especificando el mismo atributo html " nombre " para cada grupo.
SIN EMBARGO
MVC no le permite especificar su propio atributo de nombre cuando usa html helper de esta manera:
@Html.RadioButtonFor(i => item.id, item.SelectedID, new { Name = item.OptServiceCatId })
Porque examina el atributo " nombre " de cada etiqueta (no " id ") para asignar / vincular el formulario al modelo que recibe el controlador, etc.
Algunos dijeron que al especificar cada uno con el mismo atributo "GroupName" se resolverá el problema, pero tampoco funcionó.
Entonces, ¿hay alguna manera que funcione?
EDITAR:
Aquí está mi vista (simplificada):
@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 />
}
}
NOTA:
Mi modelo es una List<OptServices>
:
public List<OptServices> Cats {get; set;}
Y OptServices tiene una List
de OptItems
dentro:
public class OptServices
{
//a few things
public List<OptItems> Items {get; set;}
}
Arreglé un problema similar creando un RadioButtonFor con pares de texto / valor de una lista de selección. Utilicé ViewBag para enviar SelectList a la Vista, pero también puede usar datos del modelo. Mi aplicación web es un blog y tengo que crear un RadioButton con algunos tipos de artículos cuando escribe una nueva publicación.
El código a continuación fue simplificado.
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");
En la vista, utilicé un foreach para construir un botón de radio.
<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>
Tenga en cuenta que utilicé RadioButtonFor para capturar el valor de opción seleccionado por el usuario, en Controler, luego de enviar el formulario. También tuve que poner el artículo. Text fuera de RadioButtonFor para mostrar las opciones de texto .
Espero que sea útil!
Ok, así es como arreglé esto
Mi modelo es una list
de categorías . Cada categoría contiene una list
de sus subcategorías .
Con esto en mente, cada vez que se encuentre en el bucle foreach, cada RadioButton
tendrá la ID de su categoría (que es única) como su nombre attribue.
Y también utilicé Html.RadioButton
lugar de Html.RadioButtonFor
.
Aquí está el pseudo-código final de trabajo:
@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)
}
}
El resultado es:
<input name="127" type="radio" value="110">
Tenga en cuenta que NO HE puesto todos estos grupos de botones de radio dentro de un formulario. Y no sé si esta solución funcionará correctamente de alguna forma.
Gracias a todas las personas que me ayudaron a resolver esto;)
Pude usar el atributo de nombre que describiste en tu ejemplo para el bucle en el que estoy trabajando y funcionó, tal vez porque creé ID únicos. Todavía estoy considerando si debería cambiar a una plantilla de editor como se menciona en los enlaces en otra respuesta.
@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
Puedes usar Dictonary para mapear Assume Milk, Butter, Chesse son grupo A (ListA) Water, Beer, Wine son grupo B
Dictonary<string,List<string>>) dataMap;
dataMap.add("A",ListA);
dataMap.add("B",ListB);
En View, puede foreach Keys en dataMap y procesar su acción
todo lo que necesitas es vincular el grupo a un elemento diferente en tu modelo
@Html.RadioButtonFor(x => x.Field1, "Milk")
@Html.RadioButtonFor(x => x.Field1, "Butter")
@Html.RadioButtonFor(x => x.Field2, "Water")
@Html.RadioButtonFor(x => x.Field2, "Beer")