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>
Author: Daniel Imms, 2010-04-01

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 
 68
Author: Brian Mains,
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
 186
Author: Ben Cull,
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.

 50
Author: Daniel Imms,
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.

 24
Author: ctc,
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.

 23
Author: Jeff Bobish,
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
 8
Author: Stafford Williams,
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.
 5
Author: KyleMit,
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")
 1
Author: attack,
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