Mi modelo tiene un valor booleano que debe ser anulable
public bool? Foo
{
get;
set;
}
así que en mi cshtml de Razor tengo
@Html.CheckBoxFor(m => m.Foo)
excepto que eso no funciona. Tampoco lo hace con (bool). Si lo hago
@Html.CheckBoxFor(m => m.Foo.Value)
eso no crea un error, pero no se vincula a mi modelo cuando se publica y foo se establece en nulo. ¿Cuál es la mejor manera de mostrar Foo en la página y vincularlo a mi modelo en una publicación?
asp.net-mvc-3
razor
nullable
DMulligan
fuente
fuente
Respuestas:
Lo tengo para trabajar
y luego hacer un Boolean.cshtml en mi carpeta EditorTemplates y pegar
dentro.
fuente
HasValue
propiedad anulable , pero no el valor booleano real. Esto creará una casilla de verificación marcada independientemente del valor subyacente. Si el valor que acepta valores NULL tiene un valor, siempre será verdadero.Respuesta encontrada en una pregunta similar: renderizar Nullable Bool como CheckBox . Es muy sencillo y simplemente funciona:
Es como una respuesta aceptada de @afinkelstein, excepto que no necesitamos una 'plantilla de editor' especial
fuente
Tengo
bool? IsDisabled { get; set; }
en Model. Insertado si está en Ver.fuente
¿Por qué? Esto no tiene sentido. Una casilla de verificación tiene dos estados: marcado / no marcado, o Verdadero / Falso si lo desea. No existe un tercer estado.
¿O espera, estás usando tus modelos de dominio en tus vistas en lugar de ver modelos? Ese es tu problema. Entonces, la solución para mí es usar un modelo de vista en el que definirás una propiedad booleana simple:
y ahora la acción del controlador pasará este modelo de vista a la vista y generará la casilla de verificación adecuada.
fuente
No se recomienda complicar una primitiva con campos ocultos para aclarar si False o Null.
La casilla de verificación no es lo que debería usar; en realidad, solo tiene un estado: marcado . De lo contrario, podría ser cualquier cosa.
Cuando el campo de su base de datos es un booleano que acepta valores NULL (
bool?
), la UX debe usar 3 botones de opción, donde el primer botón representa su "Marcado", el segundo botón representa "No marcado" y el tercer botón representa su nulo, cualquiera que sea la semántica de nulo significa. Puede usar una<select><option>
lista desplegable para ahorrar espacio, pero el usuario tiene que hacer clic dos veces y las opciones no son tan claras instantáneamente.RadioButtonList, definida como una extensión denominada RadioButtonForSelectList, crea los botones de opción por usted, incluido el valor seleccionado / marcado, y establece el valor
<div class="RBxxxx">
para que pueda usar css para hacer que sus botones de opción se vuelvan horizontales (pantalla: bloque en línea), verticales o en forma de tabla (display: inline-block; width: 100px;)En el modelo (estoy usando cadena, cadena para la definición del diccionario como ejemplo pedagógico. ¿Puede usar bool ?, cadena)
fuente
Para mí, la solución fue cambiar el modelo de vista. Considere que está buscando facturas. Estas facturas se pueden pagar o no. Entonces, su búsqueda tiene tres opciones: Pagada, No pagada o "No me importa".
¿Tenía esto configurado originalmente como bool? campo:
Esto me hizo tropezar con esta pregunta. Terminé creando un tipo Enum y manejé esto de la siguiente manera:
Por supuesto, los tenía envueltos en etiquetas y tenía el texto especificado, solo quiero decir, aquí hay otra opción a considerar.
fuente
La casilla de verificación solo le ofrece 2 valores (verdadero, falso). El booleano anulable tiene 3 valores (verdadero, falso, nulo) por lo que es imposible hacerlo con una casilla de verificación.
Una buena opción es usar un menú desplegable.
Modelo
Controlador
Ver
fuente
De hecho, crearía una plantilla para él y usaría esa plantilla con un EditorFor ().
Así es como lo hice:
Crear mi plantilla, que es básicamente una vista parcial que creé en el directorio EditorTemplates, en Compartido, en Vistas, asígnele el nombre (por ejemplo)
CheckboxTemplate
::Úselo así (en cualquier vista):
@ Html.EditorFor (x => x.MyNullableBooleanCheckboxToBe, "CheckboxTemplate")
Eso es todo.
Las plantillas son tan poderosas en MVC, úselas ... Puede crear una página completa como plantilla, que usaría con
@Html.EditorFor()
; siempre que pase su modelo de vista en la expresión lambda.fuente
El enfoque más limpio que se me ocurrió es expandir las extensiones disponibles y al mismo
HtmlHelper
tiempo reutilizar la funcionalidad proporcionada por el marco.Experimenté con 'dar forma' a la expresión para permitir un paso directo al nativo,
CheckBoxFor<Expression<Func<T, bool>>>
pero no creo que sea posible.fuente
public static MvcHtmlString CheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool?>> expression, object htmlAttributes)
y funcionó de maravilla.Tuve un problema similar en el pasado.
Cree una entrada de casilla de verificación en HTML y establezca el atributo name = "Foo". Esto aún debería publicarse correctamente.
fuente
Simplemente verifique el valor nulo y devuélvalo falso:
fuente
También enfrenté el mismo problema. Intenté el siguiente enfoque para resolver el problema porque no quiero cambiar la base de datos y volver a generar el EDMX.
fuente
Al hacer un EditorTemplate para un modelo que contiene un bool anulable ...
Divida el bool que acepta valores NULL en 2 booleanos:
Dentro de la plantilla del editor:
No devuelva la propiedad original Foo, porque ahora se calcula a partir de FooIsNull y FooCheckbox.
fuente
Todas las respuestas anteriores vinieron con sus propios problemas. La forma más fácil / limpia de la OMI es crear un ayudante
Navaja MVC5
App_Code / Helpers.cshtml
Uso
En mi escenario, una casilla de verificación que acepta valores NULL significa que un miembro del personal aún no le había hecho la pregunta al cliente, por lo que está envuelta en un estilo
.checkbox-nullable
para que pueda diseñar adecuadamente y ayudar al usuario final a identificar que no estrue
nifalse
CSS
fuente
Métodos de extensión:
fuente
Los botones de opción son útiles, pero no le permiten anular la selección . Si desea este comportamiento, considere usar un menú desplegable / seleccionar. El siguiente código generará el
SelectList
y esto se vincula con éxito a un booleano anulable:fuente
fuente
puedes probar así
fuente
Esta es una pregunta antigua y las respuestas existentes describen la mayoría de las alternativas. Pero hay una opción simple, si tienes bool? en su modelo de vista, y no le importa nulo en su interfaz de usuario:
fuente