2011-12-13 15 views
7

Soy nuevo de WebForms a MVC. Tengo campo de modelo de vista con el tipo bool? y, de forma predeterminada, EditorFor() muestra este campo como una DropDownList con una opción "No establecida". Preferiría renderizarlo como un CheckBox y, si el valor es nulo, simplemente configúrelo como no seleccionado.Rendering Nullable Bool como CheckBox

El campo nombre es RFP.DatesFlexible y por lo que escribió el siguiente marcado en mi opinión:

<input type="checkbox" id="RFP_DatesFlexible" name="RFP.DatesFlexible" /> 
<label for="RFP_DatesFlexible">My Dates are Flexible</label> 

Pero esto no funciona. El resultado es siempre nulo y ModelState.IsValid es falso.

¿Alguien puede decir cómo podría hacer que esto funcione?

EDITAR

Este es el código que terminó con, que parece funcionar bien.

@Html.CheckBox("RFP.DatesFlexible", Model.RFP.DatesFlexible ?? false) 
@Html.Label("RFP.DatesFlexible", "My Dates are Flexible") 

La etiqueta se asocia correctamente con la casilla de verificación para que haga clic en el texto, se activará la casilla de verificación.

+0

¡Gracias por la respuesta! – resnyanskiy

Respuesta

5

¿Algo como esto?

Modelos:

public class MyViewModel 
{ 
    public ViewModel2 RDP { get; set; } 
} 

public class ViewModel2 
{ 
    public bool? DatesFlexible { get; set; } 
} 

controlador:

public ActionResult TestBool() 
    { 
     return View(new MyViewModel { RDP = new ViewModel2() }); 
    } 

    [HttpPost] 
    public ActionResult TestBool(MyViewModel vm) 
    { 
     return View(); 
    } 

Vista:

@model mvc_testing_2.Models.MyViewModel 

@using (Html.BeginForm()) 
{ 
    @Html.CheckBox("RDP.DatesFlexible", 
     Model.RDP.DatesFlexible != null && (bool)Model.RDP.DatesFlexible) 

    <input type="submit" value="go" /> 
} 
+0

Esto no funcionará. El primer argumento es un error porque no puede convertir bool? bool Y si lo encasillo a un bool, recibo un error porque no es una propiedad. –

+0

Muy bien, luego cámbialo a esto: '@ Html.CheckBox (" DatesFlexible ", Model.DatesFlexible! = Null && (bool) Model.DatesFlexible)'. Esto funciona, acabo de probarlo. (¿La RFP es una propiedad de otro modelo? Model.RFP.DatesFlexible? En caso afirmativo, es probable que deba nombrar la entrada como la tiene en su pregunta, no recuerdo nada) – hawkke

+0

Eso compila - gracias . Sin embargo, el campo sigue siendo 'nulo' cuando se envía la página. De alguna manera, no está aprendiendo que el control está asociado con el campo. (El campo es Model.RFP.DatesFlexible). –

1

En primer lugar, creo que ayudaría a entender cómo Html.CheckBox obras. No es exactamente lo que esperarías. Eche un vistazo a HTML.CheckBox Behaviour

Para responder a su pregunta, la razón por la que su código no funciona es porque su <input /> requiere un value='true' para enlazar correctamente. Por ejemplo:

<input type='checkbox' name='RFP.DatesFlexible' value='true' /> 

Y añadir una propiedad checked='checked' si debe ser revisado.

Por eso generalmente anulo el método Html.CheckBox con el mío. La implementación predeterminada es simplemente confusa.

+0

Sí, eso es confuso. He editado mi pregunta para mostrar el código real que terminé usando. Todavía podía usar la sintaxis '@ Html', ya que ofrece algunos beneficios. Y, por supuesto, si examino el marcado, sí contiene el atributo 'value = 'true''. –

+0

@JonathanWood Su código actual arriba parece perfecto, eso es exactamente lo que habría hecho. –

0

Sé que está marcado como aceptado, sin embargo, tuve el problema similar pero estaba iterando sobre los elementos secundarios, así que tuve un problema con el parámetro de nombre bool?isOpen

Cuando he usado esto es se unió al modelo de vista en el poste pero si se ven en el menú desplegable:

@Html.EditorFor(model => model.Days[i].isOpen) 

Esto hizo que la casilla de verificación pero los valores donde nulo en el mensaje:

@Html.EditorFor("isOpen", model.Days[i].isOpen ?? false) 

Al observar en el html renderizado lo hice en la vista que lo resolvió:

@Html.CheckBox("Days[" + i +"].isOpen", Model.Days[i].isOpen ?? false) 

Sé que es sé que es un poco rápido n sucio pero funcionó

Espero que esto ayude a alguien en algún lugar.