2008-12-17 6 views

Respuesta

4

Cuando todo lo demás falla, lea el código fuente. :) esto es de HtmlHelper.cs:

  // Render an additional <input type="hidden".../> for checkboxes. This 
      // addresses scenarios where unchecked checkboxes are not sent in the request. 
      // Sending a hidden input makes it possible to know that the checkbox was present 
      // on the page when the request was submitted. 

No estoy exactamente seguro de lo útil que es, pero al menos se conoce la intención.

5

Estaba teniendo algunos problemas esta mañana con la recuperación de valores seleccionados de un grupo de casillas de verificación en mi aplicación MVC. Envié esto a mi equipo y pensé que lo compartiría con todos los demás.

Al publicar valores de retorno para casillas de verificación, el comportamiento estándar de todos los navegadores es dejar completamente fuera las casillas de verificación no marcadas de la publicación posterior. Por lo tanto, si tiene una casilla de verificación que no está marcada, no aparece nada en Request.Form. Este es un fenómeno bastante conocido que la mayoría de los desarrolladores tienen en cuenta.

En ASP.Net MVC cuando se utiliza Html.Checkbox, se intenta evitar esto y asegurarse de que tiene un valor publicado atrás (en ‘falsas’ este caso) para casillas de verificación desmarcado. Esto se hace agregando un campo oculto que contiene el valor 'falso'.

Ej.

<%= Html.CheckBox("Sites", s.Selected, new { value = s.Value })%> 

Produce el código HTML

<input id="Sites" name="Sites" type="checkbox" value="1" /><input name="Sites" type="hidden" value="false" /> 

Todo esto es bueno y bien, hasta que intente utilizar grupos de casillas de verificación. Eso es más de una casilla de verificación con el mismo nombre donde los valores se envían en una sola cadena separada por comas. MVC puede dividir esta cadena automáticamente si define el valor como una matriz (string [] Sites).

Aquí está el código de la vista:

<% foreach(var s in Model) { %> 
       <li><%= Html.CheckBox("Sites", s.Selected, new { value = s.Value })%> 
       <label><%= s.Name %></label> 
       </li> 
     <% } %> 

La acción controladora adecuada:

[AcceptVerbs (HttpVerbs.Post)] pública ActionResult Editar (int id, nombre de la cadena, submissionUrl la secuencia, secuencia [] Sitios)

Desafortunadamente, dado que Html.Checkbox también produce este valor de campo oculto, la matriz resultante contiene no solo valores para las casillas de verificación seleccionadas sino también 'falso' para cada casillero no marcado. Se obtiene una matriz que es como la siguiente:

[0] 'false' 
[1] 'false' 
[2] '110' 
[3] '50' 
[4] 'false' 

Donde 'falso' es para casillas de verificación que no están seleccionados, y los números enteros son los valores de las casillas de verificación que están seleccionados.

Esto puede lanzar su código fuera un poco si tiene sólo enteros para los valores de las casillas de verificación y desea definir el resultado como una matriz de enteros, así:

ActionResult pública Editar (int id, string Nombre, string SubmissionUrl, int [] Sites)

Lo que da como resultado el lanzamiento de una excepción porque no puede convertir el valor de la cadena 'falso' en un entero.

La solución es muy simple, sólo evitar Html.Checkbox y crear manualmente las casillas de verificación en el código vista como esta:

<% foreach(var s in Model) { %> 
      <li><input type="checkbox" name="Sites" value="<%=s.Value%>" <% if (s.Selected) { %>checked="checked"<% } %> /> 
      <label><%= s.Name %></label> 
      </li> 
    <% } %> 

Espero que esto ayude a alguien más!

+0

sí lo hizo. Sospeché que tendría que recurrir al abandono de los helpers html. – quakkels

Cuestiones relacionadas