2010-04-01 19 views
114

¿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?ASP.NET MVC Sí/No Botones de radio con Strongly Bound Model 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 por Brian para la dirección, pero fue todo 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> 
+4

El "problema" con estas soluciones (y estoy usando el estilo Ben Cull en mi proyecto) es que no se pueden hacer etiquetas con ellas. Los dos botones de ingreso de radio tendrán el mismo identificador y el nombre, por lo que si se utiliza Html.LabelFor, se enlazarán a la primera entrada botón de opción en el DOM con ese ID. Como dije, estoy usando esta solución para los botones de radio para representar un campo booleano, sólo quería que la gente supiera que las etiquetas serán un poco torcidas. Ver respuesta – Gromer

+2

Jeff Bobish para ver cómo solucionar el problema de la etiqueta elegante. –

Respuesta

67

El segundo parámetro está seleccionado, por lo tanto, utilice el! para seleccionar el valor sin cuando el valor booleano es falso.

<%= Html.RadioButton("blah", !Model.blah) %> Yes 
<%= Html.RadioButton("blah", Model.blah) %> No 
179

Si está utilizando MVC 3 y Razor también se puede utilizar lo siguiente:

@Html.RadioButtonFor(model => model.blah, true) Yes 
@Html.RadioButtonFor(model => model.blah, false) No 
8

o MVC 2.0:

<%= Html.RadioButtonFor(model => model.blah, true) %> Yes 
<%= Html.RadioButtonFor(model => model.blah, false) %> No 
24

Edificio ligeramente fuera de la respuesta de Ben, añade atributos para la identificación, así que podría 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.

+7

Normalmente, la etiqueta es después de un botón de opción. –

+4

Poner una etiqueta en torno a un botón de opción es perfectamente válida. –

23

Adición de etiquetas de la etiqueta alrededor de los botones de radio usando HTML normal va a solucionar el problema 'labelfor', así:

<label><%= Html.RadioButton("blah", !Model.blah) %> Yes</label> 
<label><%= Html.RadioButton("blah", Model.blah) %> No</label> 

clic en el texto que ahora se selecciona el botón de radio correspondiente.

49

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 pueden determinar programáticamente los botones de opción para un 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 añadir un argumento @checked al objeto anónimo para establecer el botón de opción como predeterminada:

new { id = "married-true", @checked = 'checked' } 

Tenga en cuenta que puede enlazar a una cadena reemplazando true y false con los valores de cadena.

+0

Es una respuesta correcta. ¡Gracias! –

+0

En realidad, debería usar new {id = Html.Id ("married-true")}, reduciendo los posibles problemas de alcance de los prefijos de id generados. – eoleary

1

que terminaron el envasado de esto en un método de extensión de modo (1) que pudiera generar la etiqueta y la radio a la vez y (2) por lo que no hay que molestarse con la especificación de mis propias IDs:

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") 
5

Si puedo tirar mi sombrero en el anillo, creo que hay una manera más limpia que las respuestas existentes para volver a utilizar la funcionalidad del botón de radio.

Digamos que usted tiene la siguiente propiedad en su modelo de vista:

Public Class ViewModel 
    <Display(Name:="Do you like Cats?")> 
    Public Property LikesCats As Boolean 
End Class 

Puede exponer que la propiedad a través de un reutilizable editor template:

En primer lugar, crear el archivo Views/Shared/EditorTemplates/YesNoRadio.vbhtml

A continuación, agregue el siguiente código para 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 al especificar manualmente el nombre de la plantilla en su Ver:

@Html.EditorFor(Function(model) model.LikesCats, "YesNoRadio") 

Pros:

  • Cómo escribir HTML en un editor de HTML en lugar de agregar cadenas en el código de atrás.
  • conserva el DisplayName DataAnnotation
  • Permite clics en la etiqueta para alternar botón de radio
  • menos código posible mantener en la forma (1 línea). Si algo anda mal con la forma en que se desgarra, tómalo con la plantilla.
+0

Esto es bueno, pero ¿qué tal una tercera opción para Boolean? @ Html.RadioButtonFor (Función (Modelo) Model.IsVerified, True) @ Html.RadioButtonFor (Función (Modelo) Model.IsVerified, False) Sin @ Html.RadioButtonFor (Función (Modelo) Model.IsVerified , Nothing)) Pendiente JoshYates1980