Estoy trabajando en una aplicación ASP.NET MVC 4. Esta aplicación tiene una forma básica. El modelo de mi formulario se parece a lo siguiente:
public class MyModel
{
public string Name { get; set; }
public bool Remember { get; set; }
}
En mi formulario, tengo el siguiente HTML.
<input id="Name" name="Name" type="text" value="@Model.Name" />
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
<label for="Remember"> Remember Me?</label>
Cuando publico el formulario, el valor de Recordar en el modelo siempre es falso. Sin embargo, la propiedad Name del modelo tiene un valor. Probé esto estableciendo un punto de interrupción en lo siguiente:
[HttpPost]
public ActionResult MyAction(MyModel model)
{
Console.WriteLine(model.Remember.ToString());
}
No puedo resolverlo. ¿Por qué no se establece el valor de la casilla de verificación?
c#
asp.net-mvc-4
JQuery Mobile
fuente
fuente
Respuestas:
Generará:
Como funciona:
checkbox
permanece sin marcar, el formulario envía solo elhidden
valor (falso)true
para labool
propiedad del modelo<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
Esto siempre enviará el valor predeterminado, si está marcado.
fuente
Dado que está utilizando Model.Name para establecer el valor. Supongo que está pasando un modelo de vista vacío a la Vista.
Entonces, el valor de Remember es falso y establece el valor del elemento de casilla de verificación en falso. Esto significa que cuando selecciona la casilla de verificación, está publicando el valor "falso" con el formulario. Cuando no lo selecciona, no se publica, por lo que el modelo predeterminado es falso. Es por eso que está viendo un valor falso en ambos casos.
El valor solo se pasa cuando marca la casilla de selección. Para hacer una casilla de verificación en el uso de Mvc
o si no desea vincular el modelo a la vista.
Mvc hace algo de magia con un campo oculto para conservar los valores cuando no están seleccionados.
Edite, si realmente tiene aversión a hacer eso y desea generar el elemento usted mismo, puede hacerlo.
fuente
@Html.CheckboxFor
código debería ser@Html.CheckBoxFor
@(Model.Remember ? "checked=\"checked\"" : "")
en un botón de opción? ¿O eso no es posible?type="radio"
, y seleccionar el que desea seleccionar en el HTML es lo mismo que arribachecked="checked"
,. La diferencia es que tendrás varios<input />
elementos con el mismo nombre. Debe averiguar a cuál de ellos aplicar el HTML adicional.@Html.CheckBoxFor(x => x.Remember)
esto funcionó para míUsa solo esto
fuente
$(this).val($(this).is(":checked"));
En vez de
utilizar:
Eso le dará una casilla de verificación específicamente para Recordar
fuente
De acuerdo, la casilla de verificación es un poco extraña. Cuando usa el ayudante Html, genera dos entradas de casilla de verificación en el marcado, y ambas se pasan como un par nombre-valor de IEnumerable si está marcado.
Si no está marcado en el marcado, se pasa solo en la entrada oculta que tiene el valor falso.
Entonces, por ejemplo, en el marcado tiene:
Y en la acción del controlador (asegúrese de que el nombre coincida con el nombre del parámetro de la casilla de verificación en el controlador):
Luego, en el controlador puedes hacer algunas cosas como:
Sé que esta no es una solución elegante. Espero que alguien de aquí pueda dar algunos consejos.
fuente
Para convertir un valor devuelto de una casilla de verificación en un formulario a una propiedad booleana, utilicé el convertidor de construcción ValueProviderResult en un ModelBinder personalizado.
fuente
Si trabaja con FormCollection en lugar de modelo, la asignación puede ser tan simple como:
fuente
Me encontré con un problema similar y pude recuperar el valor de la casilla de verificación usando una casilla de verificación, hiddenfor y un pequeño JQuery así:
fuente
Esto ha sido un gran dolor y parece que debería ser más sencillo. Aquí está mi configuración y solución.
Estoy usando el siguiente ayudante HTML:
@Html.CheckBoxFor(model => model.ActiveFlag)
Luego, en el controlador, estoy verificando la recopilación de formularios y procesando en consecuencia:
fuente
user.IsActive = fc["IsActive"] != "false";
que todavía me siento sucio por hacer una comparación de cadenas en él.Me acabo de encontrar con esto (¡no puedo creer que no se encienda / apague!)
¡De todos modos!
Publicará un valor de "encendido" o "apagado".
Esto NO se vinculará a un booleano, ¡pero puede hacer esta tonta solución!
fuente
fuente
Para MVC usando Model. Modelo:
HTML:
En la función [HttpPost], podemos obtener sus propiedades.
fuente
Si realmente desea usar HTML simple (por cualquier motivo) y no las extensiones integradas de HtmlHelper, puede hacerlo de esta manera.
En vez de
intenta usar
Las entradas de casilla de verificación en HTML funcionan de modo que cuando están marcadas, envían el valor, y cuando no están marcadas, no envían nada en absoluto (lo que hará que ASP.NET MVC retroceda al valor predeterminado de la campo,
false
). Además, el valor de la casilla de verificación en HTML puede ser cualquier cosa, no solo verdadero / falso, por lo que si realmente lo desea, puede incluso usar una casilla de verificación para un campo de cadena en su modelo.Si usa el incorporado
Html.RenderCheckbox
, en realidad genera dos entradas: casilla de verificación y un campo oculto para que se envíe un valor falso cuando la casilla de verificación no está marcada (no solo nada). Eso puede causar algunas situaciones inesperadas, como esta:fuente
Para varias casillas de verificación con el mismo nombre ... Código para eliminar falsos innecesarios:
Función
Úselo:
fuente
fuente
Modificar Recuerda así
Use bool anulable en el controlador y retroceda a falso en nulo como este
fuente
En mi caso, no estaba configurando la propiedad del modelo "Recordar" en el método get. Verifique su lógica en el controlador. Puede que estés haciendo lo mismo. ¡Espero que esto ayude!
fuente
Leí las otras respuestas y no estaba logrando que funcionara, así que esta es la solución con la que terminé.
Mi formulario usa
Html.EditorFor(e => e.Property)
para generar la casilla de verificación, y al usarloFormCollection
en el controlador, esto pasa un valor de cadena de'true,false'
en el controlador.Cuando manejo los resultados, uso un ciclo para recorrerlos; también uso una
InfoProperty
instancia para representar el valor del modelo actual que se evalúa desde el formulario.Entonces, en cambio, solo verifico si la cadena devuelta comienza con la palabra
'true'
y luego establezco una variable booleanatrue
y la paso al modelo de devolución.fuente