tutorial - pasar datos de una vista a un controlador c#
Botones de radio Sí/No de ASP.NET MVC con modelo MVC fuertemente encuadernado (8)
Agregar etiquetas de etiquetas alrededor de los botones de radio con HTML regular también solucionará el problema ''etiqueta'':
<label><%= Html.RadioButton("blah", !Model.blah) %> Yes</label>
<label><%= Html.RadioButton("blah", Model.blah) %> No</label>
Al hacer clic en el texto, ahora se selecciona el botón de opción apropiado.
¿Alguien sabe cómo vincular un botón de opción Sí / No a una propiedad booleana de un modelo fuertemente tipado en ASP.NET MVC?
Modelo
public class MyClass
{
public bool Blah { get; set; }
}
Ver
<%@ Page Title="blah" Inherits="MyClass"%>
<dd>
<%= Html.RadioButton("blah", Model.blah) %> Yes
<%= Html.RadioButton("blah", Model.blah) %> No
</dd>
Gracias
SOLUCIÓN:
Gracias a Brian por la dirección, pero fue lo contrario de lo que escribió. Como tal -
<%@ Page Title="blah" Inherits="MyClass"%>
<dd>
<%= Html.RadioButton("blah", !Model.blah) %> Yes
<%= Html.RadioButton("blah", Model.blah) %> No
</dd>
Aquí hay un ejemplo más completo usando un fieldset
por razones de accesibilidad y especificando el primer botón como el predeterminado. Sin un conjunto de fieldset
, para qué fieldset
los botones de fieldset
no puede determinarse programáticamente.
Modelo
public class MyModel
{
public bool IsMarried { get; set; }
}
Ver
<fieldset>
<legend>Married</legend>
@Html.RadioButtonFor(e => e.IsMarried, true, new { id = "married-true" })
@Html.Label("married-true", "Yes")
@Html.RadioButtonFor(e => e.IsMarried, false, new { id = "married-false" })
@Html.Label("married-false", "No")
</fieldset>
Puede agregar un argumento @checked
al objeto anónimo para establecer el botón de @checked
como predeterminado:
new { id = "married-true", @checked = ''checked'' }
Tenga en cuenta que puede enlazar a una cadena reemplazando true
y false
con los valores de cadena.
El segundo parámetro está seleccionado, entonces usa el! para seleccionar el valor sin cuando el valor booleano es falso.
<%= Html.RadioButton("blah", !Model.blah) %> Yes
<%= Html.RadioButton("blah", Model.blah) %> No
Partiendo ligeramente de la respuesta de Ben, agregué atributos para la identificación para poder usar etiquetas.
<%: Html.Label("isBlahYes", "Yes")%><%= Html.RadioButtonFor(model => model.blah, true, new { @id = "isBlahYes" })%>
<%: Html.Label("isBlahNo", "No")%><%= Html.RadioButtonFor(model => model.blah, false, new { @id = "isBlahNo" })%>
Espero que esto ayude.
Si está utilizando MVC 3 y Razor también puede usar lo siguiente:
@Html.RadioButtonFor(model => model.blah, true) Yes
@Html.RadioButtonFor(model => model.blah, false) No
Si puedo lanzar mi sombrero al cuadrilátero, creo que hay una manera más limpia que las respuestas existentes para reutilizar la funcionalidad del botón de radio.
Supongamos que tiene la siguiente propiedad en su ViewModel :
Public Class ViewModel
<Display(Name:="Do you like Cats?")>
Public Property LikesCats As Boolean
End Class
Puede exponer esa propiedad a través de una plantilla de editor reutilizable:
Primero, crea el archivo Views/Shared/EditorTemplates/YesNoRadio.vbhtml
A continuación, agregue el siguiente código a YesNoRadio.vbhtml :
@ModelType Boolean?
<fieldset>
<legend>
@Html.LabelFor(Function(model) model)
</legend>
<label>
@Html.RadioButtonFor(Function(model) model, True) Yes
</label>
<label>
@Html.RadioButtonFor(Function(model) model, False) No
</label>
</fieldset>
Puede llamar al editor de la propiedad especificando manualmente el nombre de la plantilla en su Vista :
@Html.EditorFor(Function(model) model.LikesCats, "YesNoRadio")
Pros:
- Llegue a escribir HTML en un editor de HTML en lugar de anexar cadenas en el código subyacente.
- Conserva la anotación de datos de DisplayName
- Permite hacer clic en la etiqueta para alternar el botón de opción
- Código mínimo posible para mantener en forma (1 línea). Si algo anda mal con la forma en que se desgarra, tómalo con la plantilla.
Terminé empaquetando esto en un método de extensión, así que (1) pude generar la etiqueta y la radio de una vez y (2) así no tuve que preocuparme por especificar mis propios ID:
public static class HtmlHelperExtensions
{
public static MvcHtmlString RadioButtonAndLabelFor<TModel, TProperty>(this HtmlHelper<TModel> self, Expression<Func<TModel, TProperty>> expression, bool value, string labelText)
{
// Retrieve the qualified model identifier
string name = ExpressionHelper.GetExpressionText(expression);
string fullName = self.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
// Generate the base ID
TagBuilder tagBuilder = new TagBuilder("input");
tagBuilder.GenerateId(fullName);
string idAttr = tagBuilder.Attributes["id"];
// Create an ID specific to the boolean direction
idAttr = String.Format("{0}_{1}", idAttr, value);
// Create the individual HTML elements, using the generated ID
MvcHtmlString radioButton = self.RadioButtonFor(expression, value, new { id = idAttr });
MvcHtmlString label = self.Label(idAttr, labelText);
return new MvcHtmlString(radioButton.ToHtmlString() + label.ToHtmlString());
}
}
Uso:
@Html.RadioButtonAndLabelFor(m => m.IsMarried, true, "Yes, I am married")
o MVC 2.0:
<%= Html.RadioButtonFor(model => model.blah, true) %> Yes
<%= Html.RadioButtonFor(model => model.blah, false) %> No