2011-11-13 10 views
9

Tengo una tarea aparentemente fácil de configurar un botón de opción "marcado" según el valor booleano del modelo. Tengo un booleano en mi modelo "IsSDPDonor" que quiero usar para los botones Sí/No Radio. El botón de opción "Sí" se debe marcar si "IsSDDonor" es verdadero y "No" si es falso. Traté de usar el código a continuación, pero siempre comprueba el botón de opción "No".asp.net mvc3 botón de selección de verificación basado en el modelo

@Html.Label("Would You Like to Donate Platelets (SDP)") : 
@Html.RadioButtonFor(m => m.Donor.IsSDPDonor, true, new {@checked = Model.Donor.IsSDPDonor ? "checked" : ""}) Yes 
@Html.RadioButtonFor(m => m.Donor.IsSDPDonor, false, new { @checked = !Model.Donor.IsSDPDonor ? "checked" : "" }) No 

Me estaba poniendo un poco frustrado, así que pensé que prefería tomar algo de ayuda. Básicamente, la sintaxis HTML dice que solo coloque el atributo "Comprobado" sin ningún valor para marcar un botón de opción. Me preguntaba cómo haría eso usando la sintaxis de la navaja MVC3.

+1

¿Por qué están utilizando '@ checked' en lugar de' checked' en la definición de objeto anónimo? Además, usar 'checked =" checked "' debería tener el mismo efecto que el marcado sin valores, con menos problemas de compatibilidad – smartcaveman

+1

@smartcaveman porque 'checked' es una palabra clave que debe usar' @ 'para distinguirlo como variable (nombre de la propiedad, en este caso). – tvanfosson

Respuesta

13

Crea las opciones de HTML en un bloque de código, dejándolas nulas si no se debe marcar el botón, luego utiliza la variable adecuada en tu ayuda.

@{ 
    var yesOptions = Model.Donor.IsSDPDonor ? new { @checked = "checked" } : null; 
    var noOptions = Model.Donor.IsSDPDonor ? null : new { @checked = "checked" }; 
} 
@Html.Label("Would You Like to Donate Platelets (SDP)") : 
@Html.RadioButtonFor(m => m.Donor.IsSDPDonor, true, yesOptions) Yes 
@Html.RadioButtonFor(m => m.Donor.IsSDPDonor, false, noOptions) No 

EDITAR: Después de ver el código fuente, me parece que se debe establecer esta propiedad en base al valor del modelo. ¿Has intentado omitir por completo los atributos HTML?

case InputType.Radio: 
    if (!usedModelState) { 
     string modelStateValue = htmlHelper.GetModelStateValue(name, typeof(string)) as string; 
     if (modelStateValue != null) { 
      isChecked = String.Equals(modelStateValue, valueParameter, StringComparison.Ordinal); 
      usedModelState = true; 
     } 
    } 
    if (!usedModelState && useViewData) { 
     isChecked = htmlHelper.EvalBoolean(name); 
    } 
    if (isChecked) { 
     tagBuilder.MergeAttribute("checked", "checked"); 
    } 
    tagBuilder.MergeAttribute("value", valueParameter, isExplicitValue); 
    break; 
+0

rápido y agradable. Muchas gracias – Jatin

+0

@Nirvan ver mi actualización – tvanfosson

+0

Gracias por señalar eso en su actualización. De hecho, no necesitamos ningún atributo html en este caso. Simplemente funciona. Estupendo. Gracias de nuevo. – Jatin

Cuestiones relacionadas