c# - checkbox in mvc 4 razor example
Obtener el valor de Checkbox en ASP.NET MVC 4 (17)
Acabo de toparme con esto (¡no puedo creer que no se cierre / desactive!)
De todos modos!
<input type="checkbox" name="checked" />
Publicará un valor de "encendido" o "apagado".
Este WONT se une a un booleano, ¡pero puedes hacer esta tonta solución!
public class MyViewModel
{
/// <summary>
/// This is a really dumb hack, because the form post sends "on" / "off"
/// </summary>
public enum Checkbox
{
on = 1,
off = 0
}
public string Name { get; set; }
public Checkbox Checked { get; set; }
}
Estoy trabajando en una aplicación ASP.NET MVC 4. Esta aplicación tiene una forma básica. El modelo de mi formulario tiene el siguiente aspecto:
public class MyModel
{
public string Name { get; set; }
public bool Remember { get; set; }
}
En mi forma, 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 Remember en el modelo siempre es falso. Sin embargo, la propiedad Name en el modelo tiene un valor. Lo he probado 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 Checkbox?
Dado que está utilizando Model.Name para establecer el valor. Supongo que está pasando un modelo de vista vacía a la Vista.
Por lo tanto, el valor de Remember es falso y establece el valor en el 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 se establece de manera predeterminada en falso. Por eso 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
@Html.CheckBoxFor(x => x.Remember)
o si no desea vincular el modelo a la vista.
@Html.CheckBox("Remember")
Mvc hace algo de magia con un campo oculto para conservar los valores cuando no están seleccionados.
Editar, si realmente tiene una aversión a hacer eso y desea generar el elemento usted mismo, podría hacerlo.
<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked=/"checked/"" : "") />
De acuerdo, la casilla de verificación es un poco rara. Cuando utiliza Html helper, genera dos entradas checkbox en el marcado, y ambas pasan como un par nombre-valor de IEnumerable si está marcado.
Si no se verifica en el marcado, solo se pasa a la entrada oculta que tiene el valor de falso.
Entonces, por ejemplo, en el marcado que tienes:
@Html.CheckBox("Chbxs")
Y en la acción del controlador (asegúrese de que el nombre coincida con el nombre del parámetro de casilla de verificación en el controlador):
public ActionResult Index(string param1, string param2,
string param3, IEnumerable<bool> Chbxs)
Luego, en el controlador puedes hacer algunas cosas como:
if (Chbxs != null && Chbxs.Count() == 2)
{
checkBoxOnMarkup = true;
}
else
{
checkBoxOnMarkup = false;
}
Sé que esta no es una solución elegante. Espero que alguien aquí pueda dar algunos consejos.
En lugar de
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
utilizar:
@Html.EditorFor(x => x.Remember)
Eso le dará una casilla específica para Recordar
En mi caso, no estaba configurando la propiedad del modelo "Remember" en el método get. Verifica tu lógica en el controlador. Usted puede estar haciendo lo mismo. Espero esta ayuda!
Este ha sido un gran dolor y parece que debería ser más simple. Aquí está mi configuración y solución.
Estoy usando el siguiente ayudante de HTML:
@Html.CheckBoxFor(model => model.ActiveFlag)
Luego, en el controlador, estoy verificando la recopilación de formularios y el procesamiento en consecuencia:
bool activeFlag = collection["ActiveFlag"] == "false" ? false : true;
[modelObject].ActiveFlag = activeFlag;
Leí las otras respuestas y no conseguía que funcionara, así que aquí está la solución con la que terminé.
Mi formulario usa Html.EditorFor(e => e.Property)
para generar la casilla de verificación, y usando FormCollection
en el controlador, esto pasa un valor de cadena de ''true,false''
en el controlador.
Cuando manejo los resultados, utilizo un ciclo para recorrerlos; también utilizo una instancia de InfoProperty
para representar el valor del modelo actual que se evalúa a partir del formulario.
Entonces, en su lugar, solo compruebo si la cadena devuelta comienza con la palabra ''true''
y luego establezco una variable booleana en true
y la paso al modelo de devolución.
if (KeyName.EndsWith("OnOff"))
{
// set on/off flags value to the model instance
bool keyTrueFalse = false;
if(values[KeyName].StartsWith("true"))
{
keyTrueFalse = true;
}
infoProperty.SetValue(processedInfo, keyTrueFalse);
}
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 poco de JQuery, así:
@Html.CheckBox("isPreferred", Model.IsPreferred)
@Html.HiddenFor(m => m.IsPreferred)
<script>
$("#isPreferred").change(function () {
$("#IsPreferred").val($("#isPreferred").val());
})
</script>
Modificar Recuerde así
public class MyModel
{
public string Name { get; set; }
public bool? Remember { get; set; }
}
Use bool nullable en el controlador y repliegue en falso en nulo como este
[HttpPost]
public ActionResult MyAction(MyModel model)
{
model.Remember = model.Remember ?? false;
Console.WriteLine(model.Remember.ToString());
}
Para casilla de verificación múltiple con el mismo nombre ... Código para eliminar falso innecesario:
List<string> d_taxe1 = new List<string>(Request.Form.GetValues("taxe1"));
d_taxe1 = form_checkbox.RemoveExtraFalseFromCheckbox(d_taxe1);
Función
public class form_checkbox
{
public static List<string> RemoveExtraFalseFromCheckbox(List<string> val)
{
List<string> d_taxe1_list = new List<string>(val);
int y = 0;
foreach (string cbox in val)
{
if (val[y] == "false")
{
if (y > 0)
{
if (val[y - 1] == "true")
{
d_taxe1_list[y] = "remove";
}
}
}
y++;
}
val = new List<string>(d_taxe1_list);
foreach (var del in d_taxe1_list)
if (del == "remove") val.Remove(del);
return val;
}
}
Úselo:
int x = 0;
foreach (var detail in d_prix){
factured.taxe1 = (d_taxe1[x] == "true") ? true : false;
x++;
}
Para convertir un valor devuelto de una casilla de verificación en un formulario a una propiedad booleana, utilicé el convertidor de compilación ValueProviderResult en un ModelBinder personalizado.
ValueProviderResult cbValue = bindingContext.ValueProvider.GetValue("CheckBoxName");
bool value = (bool)cbValue.ConvertTo(typeof(bool));
Para el MVC que usa el modelo. Modelo:
public class UserInfo
{
public string UserID { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public bool RememberMe { get; set; }
}
HTML:
<input type="checkbox" value="true" id="checkbox1" name="RememberMe" checked="@Model.RememberMe"/>
<label for="checkbox1"></label>
En la función [HttpPost], podemos obtener sus propiedades.
[HttpPost]
public ActionResult Login(UserInfo user)
{
//...
return View(user);
}
Si realmente desea utilizar HTML sin formato (por cualquier razón) y no las extensiones HtmlHelper integradas, puede hacerlo de esta manera.
En lugar de
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
intenta usar
<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked" : "") />
Las entradas Checkbox en HTML funcionan para que cuando se verifiquen, envíen el valor, y cuando no estén marcadas, no envíen nada (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, incluso puede usar una casilla de verificación para un campo de cadena en su modelo.
Si utiliza la Html.RenderCheckbox
, en realidad emite dos entradas: casilla de verificación y un campo oculto para que se envíe un valor falso cuando la casilla de verificación está desmarcada (no solo nada). Eso puede causar algunas situaciones inesperadas, como esta:
Usa solo esto
$("input[type=checkbox]").change(function () {
if ($(this).prop("checked")) {
$(this).val(true);
} else {
$(this).val(false);
}
});
@Html.EditorFor(x => x.Remember)
Generará:
<input id="Remember" type="checkbox" value="true" name="Remember" />
<input type="hidden" value="false" name="Remember" />
Como funciona:
- Si la
checkbox
permanece desactivada, el formulario envía solo el valorhidden
(falso) - Si está marcado, el formulario envía dos campos (falso y verdadero) y MVC establece
true
para la propiedadbool
del modelo
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
Esto siempre enviará el valor predeterminado, si está marcado.
@Html.EditorFor(x => x.ShowComment)
$(function () {
// set default value to control on document ready instead of ''on''/''off''
$("input[type=''checkbox''][name=''ShowComment'']").val(@Model.ShowComment.ToString().ToLower());
});
$("#ShowComment").change(function() {
// this block sets value to checkbox control for "true" / "false"
var chkVal = $("input[type=''checkbox''][name=''ShowComment'']").val();
if (chkVal == ''false'') $("input[type=''checkbox''][name=''ShowComment'']").val(true);
else $("input[type=''checkbox''][name=''ShowComment'']").val(false);
});
public ActionResult Index(string username, string password, string rememberMe)
{
if (!string.IsNullOrEmpty(username))
{
bool remember = bool.Parse(rememberMe);
//...
}
return View();
}