2010-02-24 7 views
1

Lorsque j'ai utilisé la case à cocher Helper html, il produit 2 éléments de formulaire. Je comprends pourquoi, et je n'y vois aucun problème sauf:Problème de case à cocher MVC2

La décocher de la case ne semble pas être en phase avec la valeur 'cachée'.

Je veux dire que lorsque j'ai un tas de cases à cocher étant généré dans une boucle:

<%=Html.CheckBox("model.MarketCategories[" & i & "].Value", category.Value)%> 

et le désélectionne utilisateur et la case à cocher et category.Value est FAUX, le code généré est:

<input checked="checked" id="model_MarketCategories_0__Value" name="model.MarketCategories[0].Value" type="checkbox" value="true" /> 
<input name="model.MarketCategories[0].Value" type="hidden" value="false" /> 

Ceci est faux puisque la valeur est fausse, la case ne doit PAS être cochée.

Des idées pour lesquelles cela se passe?

+0

Je crois que ce comportement est prévu, la Le champ caché reste toujours aussi faux, car certains navigateurs n'envoient pas du tout de case à cocher lorsqu'ils ne sont pas cochés. Donc, les scénarios que vous obtiendriez sont true/false false/false false false Donc, si l'une des entrées est true, elle est vérifiée, sinon elle n'est pas vérifiée. le champ caché est juste pour s'assurer qu'il y a toujours des données à vérifier. – dnolan

Répondre

0

Ce qui est pire, c'est quand il est soumis, il apparaît comme "vrai, faux". Très frustrant.

Lorsque vous cochez la case par programmation, elle ne définit pas le champ caché associé. Vous pouvez facilement contourner ce problème en écrivant le balisage de la case à cocher directement au lieu d'utiliser le contrôle MVC.

J'ai dû le faire moi-même tout récemment. C'est une bête noire. Pour plus d'informations, voir this link.

0

Cela ne fonctionnera pas pour moi parce que j'utilise des vues/contrôleurs Strongly Typed.

Je n'utilise pas:

public ActionResult ThisLooksWeird(FormCollection result) 
{ 
    var winnars = from x in result.AllKeys 
      where result[x] != "false" 
      select x; 
    // yadda 
} 

J'utilise:

public ActionResult ThisLooksWeird(MyCustomModelObject result) 
{ 
    foreach (KeyValuePair<MarketCategory, Boolean> o in result.Categories) { 
    If (o.Value == True) { 
     // yadda 
    } 
    } 
} 

Maintenant, quand j'adapter mon code pour travailler comme suggéré dans votre affichage, la correspondance entre les deux commandes (case à cocher/caché) est toujours incorrect. Il prend la valeur du composant caché (qui est toujours la valeur qui était là quand la page a été chargée) au lieu de la case à cocher qui est ce que la valeur devrait être maintenant.

+0

Je suis arrivé à la conclusion que l'aide de case à cocher est complètement foiré en utilisant des vues/contrôleurs fortement typés. Son comportement n'est absolument pas ce que vous attendez. Son état est en quelque sorte lié au dernier état dans lequel il se trouvait, mais je ne peux pas déchiffrer exactement ce qui se passe. Lorsque tous les membres de mon dictionnaire sont "Faux" et donc passent "Faux" dans l'aide de la case à cocher, parfois la valeur cachée est fausse, parfois c'est vrai mais toujours la case à cocher semble être cochée ... – Bitfiddler

+0

Quoi que je fasse, l'assistant Checkbox html génère toujours une case à cocher 'checked' (que la valeur transmise à la fonction soit true ou false). Comment cela s'est-il passé? – Bitfiddler

+0

La chose la plus étrange est que lorsque j'utilise mes actions de contrôleur 'effacer tout' et 'sélectionner tout', les cases à cocher reviennent toujours sélectionnées. Dès que je commence à les sélectionner/les effacer à la main, la case à cocher semble fonctionner correctement. Mais les actions du contrôleur définissent uniquement les valeurs de la case à cocher Dictionary sur true/false. Je ne vois pas pourquoi cela ferait une différence? – Bitfiddler

0

Bon, on dirait que David avait raison. C'est mon incompréhension de la façon dont les deux domaines travaillent ensemble qui fait que sa solution ne fonctionne pas pour moi.

Dans le cas où cette aide quelqu'un d'autre ici est ma solution et comment cela fonctionne:

D'abord, je devais les deux soi-même de champs que David avait décrit ...

<input <% 
     If category.Value = True Then 
      %> checked <% 
     End If 
     %> class="filterCheckbox" id="model_MarketCategories_<%=i%>__Value" name="model.MarketCategories[<%=i %>].Value" type="checkbox" value="true" /> 
<input name="model.MarketCategories[<%=i%>].Value" type="hidden" value="False" /> 

maintenant un bref récapitulatif des raisons pour lesquelles il y a 2 champs:

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

maintenant, la raison pour laquelle les deux éléments ont le même nom est la suivante: Si le navigateur ignore toutes les autres valeurs d'entrée avec le même nom une fois qu'il a f ound une avec une valeur valide. Donc, si votre navigateur renvoie toujours la valeur de la case à cocher (qu'elle soit cochée ou non), l'élément caché est ignoré.Si par contre votre navigateur n'envoie pas la case à cocher si la case à cocher n'est pas cochée, alors l'élément qui suit immédiatement la case positionnera la valeur de la propriété form sur false et renverra THAT.

Mon malentendu que je pensais que la case à cocher doit toujours conserver la valeur de la propriété réelle, donc quelque chose comme:

<input <% 
      If category.Value = True Then 
      %> checked <% 
      End If 
     %> class="filterCheckbox" id="model_MarketCategories_<%=i%>__Value" name="model.MarketCategories[<%=i %>].Value" type="checkbox" value="<%=category.Value %>" /> 

C'est ce qui a été à l'origine des problèmes ... la case à cocher « valeur » doit toujours être vrai . La 'valeur' ​​cachée devrait toujours être fausse. Et c'est l'état de la case à cocher (cochée ou non) qui déterminera ce qui sera renvoyé à votre contrôleur.

Merci David ... parfois, la réponse peut être juste en face de vous, mais si votre cerveau n'est pas prêt à recevoir, il n'y a rien qu'un programmeur compagnon peut faire ;-)