2010-06-14 8 views
11

Con un modelo de vista que contiene el campo:MVC mapa para bool anulable en el modelo

public bool? IsDefault { get; set; } 

consigo un error al intentar asignar en la vista:

<%= Html.CheckBoxFor(model => model.IsDefault) %> 

No se puede convertir implícitamente el tipo ' bool? ' para 'bool'. Existe una conversión explícita (¿falta un elenco?)

He intentado fundir y usar .Value y ninguno funcionó.

Observe que el comportamiento que me gustaría es que enviar el formulario establezca IsDefault en el modelo en verdadero o falso. Un valor de null simplemente significa que el modelo no se ha rellenado.

+0

¿Por qué debería verificar si el modelo se ha rellenado? ¿Tal vez hay otra manera, una correcta, de hacer lo que tienes que hacer? – AlexanderMP

+0

posible duplicado de [¿Por qué CheckBoxFor produce error de tiempo de ejecución] (http://stackoverflow.com/questions/2490790/why-is-checkboxfor-producing-runtime-error) –

Respuesta

13

El problema es que realmente tiene tres valores posibles; verdadero, falso y nulo, por lo que el CheckBoxFor no puede manejar los tres estados (solo dos estados).

Brad Wilson discute en su blog here. Él usa DropDownList para booleanos que aceptan nulos.

Este StackOverflow question hace un trabajo mucho mejor de describir la situación que hice anteriormente. La desventaja de la solución es a veces nulable, no implica que sea falsa, debe ser anulable. Un ejemplo de esto serían los criterios de filtro en los que no quiere que se aplique verdadero o falso.

7

Si no se preocupan por el valor nulo, y sólo quiere la casilla de verificación para estar sin marcar cuando su nula, puede hacer lo siguiente:

crear otra propiedad de tipo bool en su modelo como este:

public bool NotNullableBool 
{ 
    get 
    { 
     return NullableBool == true; 
    } 
    set 
    { 
     NullableBool = value; 
    } 
} 

Entonces sólo tiene que utilizar para la unión ...

+1

get {_return_ NullableBool == true; } * FIFY – vbullinger

+1

Esto funcionó para mí, y luego unir mi CheckboxFor a mi NotNullableBool – Alicia

2

para mí, esto es mucho mejor:

<%= Html.CheckBox("IsDefault", Model.IsDefault.HasValue? Model.IsDefault : false) %> 
+1

Esto está bien para verdadero/falso, pero si quieres manejar un bool real, necesitas manejar Null también (piensa en esto como Yes, No y Unknown.) – Greg

+0

Maneja nulo porque 'Model.IsDefault.HasValue' se comprobará, se encontrará que es nulo, y dará' false' como resultado. En general, no nos importa si algo es 'nulo' en nuestras variables 'verdadero/falso' --- solo queremos saber cuándo algo es verdadero/cumplido. – vapcguy

+2

A menudo esto es cierto. Pero a veces la gente quiere saber lo diferente entre lo que se conoce como verdadero, falso conocido y simplemente no disponible/desconocido. Tenemos campos como Casado. Pero queremos saber que, de hecho, se eligen como casados, o elegidos como no casados, o si no se ingresaron los datos. Si varias personas manejan el registro, el siguiente podría hacer la pregunta si nunca se le preguntó. Pero si solo lo muestra como falso, la gente asumiría que se le preguntó y se devolvió como falso. – Greg

0

Para añadir a vapcguy respuesta, otra forma más "limpia" de hacerlo es como sigue

@Html.CheckBox("IsDefault", Model?.IsDefault) 

O

<%= Html.CheckBox("IsDefault", Model?.IsDefault) %> 
0

Se puede crear un editor de plantillas para hacer una casilla para Booleanos anulables. Denomine a la plantilla Boolean.cshtml para utilizarla como valor predeterminado para todas las propiedades booleanas dentro del sitio.Asegúrese de que el archivo está en la carpeta ~/Vistas/shared/EditorTemplates

@model bool? 
@Html.CheckBox(String.Empty, Model??false) 
1

es cómo asignar un bullable booleano bool? propiedad en un DropDownListFor aquí:

@model SomeModel 

<!-- ...some HTML... --> 

@Html.DropDownListFor(m => m.NullableBooleanProperty, new SelectList(
     new[] { 
      new { Value = "", Text = "-- Choose YES or NO --" }, 
      new { Value = "true", Text = "YES" }, 
      new { Value = "false", Text = "NO" }, 
     }, 
     "Value", 
     "Text" 
    )) 

Y aquí está la forma de asignar a una CheckBoxFor mediante el uso de un no anulable propiedad proxy como una solución:

En el modelo de vista:

public bool NullableBooleanPropertyProxy 
{ 
    get 
    { 
     return NullableBooleanProperty == true; 
    } 
    set 
    { 
     NullableBooleanProperty = value; 
    } 
} 

En la Vista:

@model SomeModel 

<!-- ...some HTML... --> 

@Html.CheckBoxFor(m => m.NullableBooleanPropertyProxy) 

El único inconveniente de esta solución es que el valor null será tratado como false: si usted no puede aceptar eso, es mejor utilizar una control que puede admitir tres estados, como el ya mencionado DropDownListFor.

Para obtener más información, read here.

+0

Gracias esto funcionó como un regalo para el ejemplo de casilla de verificación – Alicia