2009-03-18 3 views
14

tema loco con el sometimiento de los valores en Html.Checkbox en ASP.NET MVC RCMVC Html.Checkbox y la forma someten tema

Algunos de los valores están simplemente no vienen a Request.Params

En mi formulario tengo esta línea dentro del ciclo:

<%=Html.CheckBox("cb" + p.Option.Id, p.Option.IsAllowed, new { value = 6 })%>

y que presta a continuación:

<input checked="checked" id="cb17" name="cb17" type="checkbox" value="6" /> 
<input name="cb17" type="hidden" value="false" /> 

    <input checked="checked" id="cb18" name="cb18" type="checkbox" value="6" /> 
<input name="cb18" type="hidden" value="false" /> 

    <input id="cb19" name="cb19" type="checkbox" value="6" /> 
<input name="cb19" type="hidden" value="false" /> 

    <input id="cb20" name="cb20" type="checkbox" value="6" /> 
<input name="cb20" type="hidden" value="false" /> 

    <input checked="checked" id="cb21" name="cb21" type="checkbox" value="6" /> 
<input name="cb21" type="hidden" value="false" /> 

Después de enviar el formulario estoy conseguir algo como:

Form.Params["cb17"] = {6, "false"} 
Form.Params["cb18"] = {6, "false"} 
Form.Params["cb19"] = {"false"} 
Form.Params["cb20"] = {"6,false"} 
Form.Params["cb21"] = {"false"} 

En la cadena de pedido Algunas de las params se muestran dos veces (situación normal) y algunos sólo una vez (sólo valor del campo oculto). Parece que no depende de si la casilla de verificación fue marcada o no, si el valor ha cambiado o menos ...

¿Alguien se enfrenta a una situación así? ¿Cómo puedo trabajar?

Respuesta

16
<% using(Html.BeginForm("Retrieve", "Home")) %>//Retrieve is the name of the action while Home is the name of the controller 
     <% { %> 
    <%foreach (var app in newApps)    { %> 
    <tr> 
     <td><%=Html.CheckBox(""+app.ApplicationId)%></td>  

    </tr> 
<%} %> 
<input type"submit"/> 
<% } %> 

y en su controlador

List<app>=newApps; //Database bind 
for(int i=0; i<app.Count;i++) 
{ 

    var checkbox=Request.Form[""+app[i].ApplicationId]; 
    if(checkbox!="false")// if not false then true,false is returned 
} 

la razón por la que comprueba por falso debido a que el asistente de HTML Casilla hace una especie de cosa extraña para el valor verdadero

True returns como:

it makes the string read "true, false" 

por lo que pueden haber pensado que era dos valores, pero es sólo uno y medios verdaderos

devuelve False como:

it makes the string read "false" 
+0

Su solución está bastante bien. Pero estoy pensando en la presentación de formulario sin estado. En cuanto a su ejemplo, no sé cuántos objetos tengo en la aplicación [i] –

+0

que acabo de actualizar. la aplicación [i] estaba iterando a través de los identificadores de formulario que estaban en la página. Como la casilla de verificación está enlazada dinámicamente, debe encontrar el ID en la base de datos y luego comparar cada valor del formulario – TStamper

+1

¿Hay alguna explicación adecuada de por qué este es el caso? ? ¿Por qué "verdadero, falso" para verdadero? – chakrit

10

Esta es la manera en que debería funcionar de acuerdo con las especificaciones.

No tiene nada que ver con ASP.NET MVC, pero cuando una casilla de verificación se deja sin marcar es no incluido en la colección POST.

Obtiene dos valores porque tiene tanto una casilla de verificación como una de entrada con el mismo nombre (y las que tienen dos valores son probablemente las que tienen casillas de verificación marcadas).

Editar: specifications del W3C

+0

sí, ahora veo lo que es la regla explicar tal comportamiento –

+0

¿Qué? eso no es cierto veggerby ... En mvc, las casillas de verificación se procesan de manera diferente a la casilla normal html – TStamper

+3

Sí, se representan como 2 entradas. Pero eso no cambia el hecho de que la casilla de verificación NO forma parte de los valores de POST a menos que se marque, que es lo que obtiene cuando mira Form.Params []. Si especificas el bool como un parámetro en tu acción, entonces sí funcionará como "esperado". Pero eso es MVC "magia". – veggerby

2

Sin la necesidad de pedir a la base de datos sobre los identificadores después de forma sometimiento/antes de guardar (modo sin estado) he producido dicho código:

foreach (string key in Request.Form) 
    { 
     var checkbox = String.Empty; 
     if (key.StartsWith("cb")) 
     { 
      checkbox = Request.Form["" + key]; 

      if (checkbox != "false") 
      { 
       int id = Convert.ToInt32(key.Remove(0, 2)); 
      } 
     } 
    } 

Gracias a ustedes que me ayude a solucionar este problema !

0

utilizo este:

public struct EditedCheckboxValue 
{ 
    public bool Current { get; private set; } 

    public bool Previous { get; private set; } 

    public bool Changed { get; private set; } 

    public EditedCheckboxValue(System.Web.Mvc.FormCollection collection, string checkboxID) : this() 
    { 
     string[] values = collection[checkboxID].Split(new char[] { ',' }); 
     if (values.Length == 2) 
     { // checkbox value changed, Format: current,old 
      Current = bool.Parse(values[0]); 
      Previous = bool.Parse(values[1]); 
      Changed = (Current != Previous); 
     } 
     else if (values.Length == 1) 
     { 
      Current = bool.Parse(values[0]); 
      Previous = Current; 
      Changed = false; 
     } 
     else 
      throw new FormatException("invalid format for edited checkbox value in FormCollection"); 
    } 
} 

y luego lo llamo así:

EditedCheckboxValue issomething = new EditedCheckboxValue(collection, "FieldName"); 
instance.IsSomething = issomething.Current; 
Cuestiones relacionadas