ASP.NET MVC Sí / No Botones de Radio con el Modelo Fuertemente Ligado MVC
¿Alguien sabe cómo enlazar un botón de opción Sí / No a una propiedad booleana de un Modelo Fuertemente escrito 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ó. As so -
<%@ Page Title="blah" Inherits="MyClass"%>
<dd>
<%= Html.RadioButton("blah", !Model.blah) %> Yes
<%= Html.RadioButton("blah", Model.blah) %> No
</dd>
8 answers
El segundo parámetro está seleccionado, así que utilice el ! para seleccionar el valor no cuando el booleano es false.
<%= Html.RadioButton("blah", !Model.blah) %> Yes
<%= Html.RadioButton("blah", Model.blah) %> No
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-08 05:37:28
Si estás usando MVC 3 y Razor también puedes usar lo siguiente:
@Html.RadioButtonFor(model => model.blah, true) Yes
@Html.RadioButtonFor(model => model.blah, false) No
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-16 04:16:45
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 fieldset
, no se puede determinar programáticamente para qué sirven los botones de opción en su conjunto.
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 opción como predeterminado:
new { id = "married-true", @checked = 'checked' }
Tenga en cuenta que puede enlazar a una cadena reemplazando true
y false
con la cadena valor.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-27 17:33:42
Basándome ligeramente en la respuesta de Ben, agregué atributos para el ID 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.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-24 22:44:26
Agregar etiquetas de etiqueta alrededor de los botones de opción usando HTML regular también solucionará el problema de 'labelfor':
<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.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-05 14:56:57
O MVC 2.0:
<%= Html.RadioButtonFor(model => model.blah, true) %> Yes
<%= Html.RadioButtonFor(model => model.blah, false) %> No
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-20 06:41:09
Si puedo lanzar mi sombrero en el ring, creo que hay una forma más limpia que las respuestas existentes para reutilizar la funcionalidad del botón de opción.
Digamos que tienes la siguiente propiedad en tu 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 un plantilla de editor:
Primero, crea el archivo Views/Shared/EditorTemplates/YesNoRadio.vbhtml
Luego 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 para el propiedad especificando manualmente el nombre de la plantilla en su Vista :
@Html.EditorFor(Function(model) model.LikesCats, "YesNoRadio")
Ventajas:
- Consigue escribir HTML en un editor HTML en lugar de añadir cadenas en el código detrás.
- Conserva la anotación de datos DisplayName
- Permite hacer clic en la etiqueta para alternar el botón de opción
- El código menos posible de mantener en forma (1 línea). Si algo está mal con la forma en que se está desgarrando, tómelo con la plantilla.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-14 18:27:27
Terminé empaquetando esto en un método de extensión para (1) poder generar la etiqueta y la radio a la vez y (2) para no tener que preocuparse 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")
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-03 21:18:47