2009-03-18 9 views
14
question

problème fou avec la soumission de valeurs dans Html.Checkbox dans ASP.NET MVC RCMVC Html.CheckBox et forme soumettre

Certaines valeurs sont tout simplement pas venir à Request.Params

A ma forme J'ai cette ligne dans le cycle:

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

et il rend à la prochaine:

<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" /> 

Après avoir soumis le formulaire Je suis obtenir quelque chose comme:

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

Dans la chaîne de demande Certains des params sont affichés deux fois (situation normale) et une seule fois (seule valeur du champ caché). Il semble que cela ne dépend pas de savoir si la case a été cochée ou non, si la valeur a changé ou alors ...

Est-ce que quelqu'un est confronté à une telle situation? Comment puis-je travailler?

Répondre

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"/> 
<% } %> 

et dans votre contrôleur

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 raison pour laquelle vous vérifiez faux parce que l'aide Html Checkbox fait une sorte de chose bizarre pour valeur true

True renvoie à:

it makes the string read "true, false" 

afin que vous puissiez avoir pensé qu'il était deux valeurs, mais son seul et vrai moyen

Faux retourne comme:

it makes the string read "false" 
+0

Votre solution est plutôt bien. Mais je pense à la soumission de formulaire sans état. En ce qui concerne votre exemple, je ne sais pas combien d'objets ai-je dans l'application [i] –

+0

Je viens de mettre à jour. l'application [i] parcourait les identifiants de formulaire qui se trouvaient sur la page. Puisque la case à cocher est dynamiquement liée, vous devez trouver l'ID dans DB puis comparer chaque valeur du formulaire. – TStamper

+1

Y a-t-il une bonne explication de pourquoi? ? pourquoi "vrai, faux" pour vrai? – chakrit

10

C'est en fait la façon dont cela devrait fonctionner selon les spécifications.

Cela n'a rien à voir avec ASP.NET MVC, mais lorsqu'une case n'est pas cochée, elle est et non incluse dans la collection POST.

Vous obtenez deux valeurs parce que vous avez à la fois une case à cocher et une entrée avec le même nom (et celles pour lesquelles vous avez deux valeurs sont très probablement celles avec les cases cochées).

Edit: specifications du W3C

+0

oui, maintenant je vois quelle est la règle qui explique un tel comportement –

+0

Quoi? ce n'est pas vrai veggerby ... Dans mvc les cases à cocher sont rendues différemment alors la case à cocher html normale – TStamper

+3

Oui, ils sont rendus comme 2 entrées. Mais cela ne change pas le fait que la case à cocher NE FAIT PAS partie des valeurs POST à ​​moins de vérifier ce qui est ce que vous obtenez lorsque vous regardez Form.Params []. Si vous spécifiez le bool comme un paramètre sur votre action, alors oui cela fonctionnera comme "attendu". Mais c'est MVC "magique". – veggerby

2

Sans la nécessité de demander à la base de données sur les ids après forme soumission/avant d'enregistrer (mode Stateless) J'ai produit ce code:

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)); 
      } 
     } 
    } 

Merci les gars vous me aider à travailler autour de cette question !

0

J'utilise ceci:

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"); 
    } 
} 

puis l'appeler comme ceci:

EditedCheckboxValue issomething = new EditedCheckboxValue(collection, "FieldName"); 
instance.IsSomething = issomething.Current; 
Questions connexes