Precaución: ¡Esta pregunta tiene más de nueve años!
Su mejor opción es buscar nuevas preguntas, o buscar las respuestas a continuación buscando su versión específica de MVC, ya que muchas respuestas aquí son obsoletas ahora.
Si encuentra una respuesta que funcione para su versión, asegúrese de que la respuesta contenga la versión de MVC que está utilizando.
(La pregunta original comienza a continuación)
Esto me parece un poco extraño, pero por lo que puedo decir, así es como lo haces.
Tengo una colección de objetos y quiero que los usuarios seleccionen uno o más de ellos. Esto me dice "formulario con casillas de verificación". Mis objetos no tienen ningún concepto de "seleccionado" (son POCO rudimentarios formados al deserializar una llamada wcf). Entonces, hago lo siguiente:
public class SampleObject{
public Guid Id {get;set;}
public string Name {get;set;}
}
En la vista:
<%
using (Html.BeginForm())
{
%>
<%foreach (var o in ViewData.Model) {%>
<%=Html.CheckBox(o.Id)%> <%= o.Name %>
<%}%>
<input type="submit" value="Submit" />
<%}%>
Y, en el controlador, esta es la única forma en que puedo ver para averiguar qué objetos revisó el usuario:
public ActionResult ThisLooksWeird(FormCollection result)
{
var winnars = from x in result.AllKeys
where result[x] != "false"
select x;
// yadda
}
Es extraño en primer lugar, y en segundo lugar, para aquellos elementos que el usuario verificó, FormCollection enumera su valor como "verdadero falso" en lugar de solo verdadero.
Obviamente, me falta algo. Creo que esto se construye con la idea en mente de que los objetos de la colección sobre los que se actúa dentro del formulario html se actualizan a UpdateModel()
través de ModelBinder.
Pero mis objetos no están preparados para esto; ¿eso significa que esta es la única manera? ¿Hay otra forma de hacerlo?
fuente
Respuestas:
Html.CheckBox está haciendo algo extraño: si ve el código fuente en la página resultante, verá que hay un
<input type="hidden" />
se genera una junto a cada casilla de verificación, lo que explica los valores "verdaderos falsos" que está viendo para cada elemento del formulario.Pruebe esto, que definitivamente funciona en ASP.NET MVC Beta porque lo acabo de probar.
Ponga esto en la vista en lugar de usar Html.CheckBox ():
Todas sus casillas de verificación se llaman
selectedObjects
y elvalue
de cada casilla de verificación es el GUID del objeto correspondiente.Luego publique en la siguiente acción del controlador (o algo similar que haga algo útil en lugar de Response.Write ())
Este ejemplo solo escribirá los GUID de las casillas que marcó; ASP.NET MVC asigna los valores GUID de las casillas de verificación seleccionadas en el
Guid[] selectedObjects
parámetro para usted, e incluso analiza las cadenas de la colección Request.Form en objetos GUID instantáneos, lo que creo que es bastante agradable.fuente
HtmlHelper agrega una entrada oculta para notificar al controlador sobre el estado No verificado. Para tener el estado correcto verificado:
fuente
En caso de que se pregunte POR QUÉ ponen un campo oculto con el mismo nombre que la casilla de verificación, el motivo es el siguiente:
Comentario del código fuente MVCBetaSource \ MVC \ src \ MvcFutures \ Mvc \ ButtonsAndLinkExtensions.cs
Supongo que detrás de escena necesitan saber esto para vincular los parámetros en los métodos de acción del controlador. Entonces podría tener un booleano de tres estados, supongo (vinculado a un parámetro bool anulable). No lo he probado, pero espero que eso sea lo que hicieron.
fuente
También debe usarlo
<label for="checkbox1">Checkbox 1</label>
porque las personas pueden hacer clic en el texto de la etiqueta y en la casilla de verificación. También es más fácil de diseñar y, al menos, en IE, se resaltará cuando desplace los controles de la página.Esto no es solo una cosa de 'oh, podría hacerlo'. Es una mejora significativa de la experiencia del usuario. Incluso si no todos los usuarios saben que pueden hacer clic en la etiqueta, muchos lo harán.
fuente
Me sorprende que ninguna de estas respuestas haya utilizado las funciones MVC incorporadas para esto.
Escribí una publicación de blog sobre esto aquí , que incluso vincula las etiquetas a la casilla de verificación. Usé el EditorTemplate carpeta para lograr esto de una manera limpia y modular.
Simplemente terminará con un nuevo archivo en la carpeta EditorTemplate que se ve así:
en su vista real, no habrá necesidad de repetir esto, simplemente 1 línea de código:
Visita mi blog para más detalles.
fuente
+1
y + cervezaEsto es lo que he estado haciendo.
Ver:
Controlador:
Encontré que los métodos de ayuda Html. * No son tan útiles en algunos casos, y que era mejor hacerlo en HTML antiguo. Siendo uno de ellos, el otro que me viene a la mente son los botones de radio.
Editar: esto está en la Vista previa 5, obviamente YMMV entre versiones.
fuente
Parecen optar por leer solo el primer valor, por lo que esto es "verdadero" cuando la casilla de verificación está marcada y "falso" cuando solo se incluye el valor oculto. Esto se obtiene fácilmente con un código como este:
fuente
@Dylan Beattie Gran descubrimiento !!! Muchas gracias Para ampliar aún más, esta técnica también funciona perfectamente con el enfoque Ver modelo. MVC es tan genial que es lo suficientemente inteligente como para vincular una matriz de Guías a una propiedad con el mismo nombre del objeto Modelo vinculado a la Vista. Ejemplo:
ViewModel:
Ver:
Controlador:
Cualquier persona familiarizada con la filosofía de Ver modelo se alegrará, ¡esto funciona como un campeón!
fuente
También me gustaría señalar que puede nombrar cada casilla de verificación con un nombre diferente y que ese nombre forme parte de los parámetros de los resultados de la acción.
Ejemplo,
Ver:
Controlador:
Los valores de la vista se pasan a la acción ya que los nombres son los mismos.
Sé que esta solución no es ideal para su proyecto, pero pensé en lanzar la idea.
fuente
Del controlador:
fuente
Este problema también ocurre en la versión 1.0. Html.Checkbox () hace que se agregue otro campo oculto con el mismo nombre / id que su casilla de verificación original. Y mientras intentaba cargar una matriz de casillas de verificación usando document.GetElemtentsByName (), puedes adivinar cómo se complicaron las cosas. Es extraño
fuente
Por lo que puedo deducir, el modelo no quiere adivinar si está marcado = verdadero o falso, solucioné esto estableciendo un atributo de valor en el elemento de casilla de verificación con jQuery antes de enviar el formulario de esta manera:
De esta manera, no necesita un elemento oculto solo para almacenar el valor de la casilla de verificación.
fuente
Sé que esta pregunta se escribió cuando MVC3 no estaba disponible, pero para cualquiera que haga esta pregunta y esté usando MVC3, es posible que desee la forma "correcta" de hacerlo.
Mientras pienso que haciendo todo
La cosa es genial y limpia, y funciona en todas las versiones de MVC, el problema es que no tiene en cuenta la cultura (como si realmente importara en el caso de un bool).
La forma "correcta" de calcular el valor de un bool, al menos en MVC3, es usar ValueProvider.
Hago esto en uno de los sitios de mi cliente cuando edito permisos:
Ahora, la belleza de esto es que puede usar esto con casi cualquier tipo simple, e incluso será correcto según la Cultura (piense en dinero, decimales, etc.).
ValueProvider es lo que se utiliza cuando forma sus acciones de esta manera:
pero cuando intenta crear dinámicamente estas listas y verificar los valores, nunca sabrá el Id en el momento de la compilación, por lo que debe procesarlos sobre la marcha.
fuente
La forma más fácil de hacerlo es ...
Usted establece el nombre y el valor.
<input type="checkbox" name="selectedProducts" value="@item.ProductId" />@item.Name
Luego, al enviar, tome los valores de las casillas de verificación y guárdelos en una matriz int. entonces la función LinQ apropiada. Eso es..
fuente
Igual que la respuesta de nautic20, simplemente use la lista de casillas de enlace de modelo predeterminado MVC con el mismo nombre que una propiedad de colección de string / int / enum en ViewModel. Eso es.
Pero hay que señalar un problema. En cada componente de la casilla de verificación, no debe poner "Id", ya que afectará el enlace del modelo MVC.
El siguiente código funcionará para el enlace del modelo:
Los siguientes códigos no se vincularán con el modelo (la diferencia aquí es la identificación asignada para cada casilla de verificación)
fuente
Esto es lo que hice para perder los valores dobles al usar el Html.CheckBox (...
con 4 casillas marcadas, sin marcar, sin marcar, marcadas se convierte en verdadero, falso, falso, falso, verdadero, falso en verdadero, falso, falso, verdadero. justo lo que necesitaba
fuente
¿Qué tal algo como esto?
fuente
Cuando uso la casilla de verificación HtmlHelper, prefiero trabajar con los datos del formulario de casilla de verificación publicados como una matriz. Realmente no sé por qué, sé que los otros métodos funcionan, pero creo que prefiero tratar las cadenas separadas por comas como una matriz tanto como sea posible.
Entonces, hacer una prueba 'marcada' o verdadera sería:
Hacer una verificación falsa sería:
La principal diferencia es usarlo
GetValues
ya que esto regresa como una matriz.fuente
Solo haz esto en
$(document).ready
:fuente
Mi solución es:
Más puede encontrar aquí: http://www.blog.mieten.pl/2010/12/asp-net-mvc-custom-checkbox-as-solution-of-string-was-not-recognized-as-a- válido-booleano /
fuente
Tuve casi el mismo problema, pero el valor de retorno de mi controlador se bloqueó con otros valores.
Encontré una solución simple pero parece un poco difícil.
Intenta escribir
Viewbag.
tu controlador y ahora le das un nombre comoViewbag.Checkbool
Ahora cambie a la Vista e intente esto
@Viewbag.Checkbool
con esto obtendrá el valor del Controlador.Los parámetros de mi controlador se ven así:
y mi casilla de verificación se actualizará así:
fuente
Usando @mmacaulay, se me ocurrió esto para bool:
Si está marcado activo = verdadero
Si no está activado activo = falso
fuente