2010-03-08 8 views
15

Quoi de neuf? La variable viewmodel est un bool avec la valeur true.Booléen avec aide html Caché et caché

<%= Html.HiddenFor(m => m.TheBool) %> 
<%= Html.Hidden("IsTimeExpanded",Model.TheBool) %> 
<input type="hidden" value="<%=Model.TheBool%>" name="TheBool" id="TheBool"> 

Résultats dans:

<input id="TheBool" name="TheBool" value="False" type="hidden"> 
<input id="TheBool" name="TheBool" value="False" type="hidden"> 
<input value="True" name="TheBool" id="TheBool" type="hidden"> 

Qu'est-ce que je fais mal? Pourquoi les aides ne fonctionnent-elles pas comme prévu?

+2

la réponse est dans http://stackoverflow.com/questions/4710447/asp-net-mvc-html-hiddenfor-with-wrong-value –

+0

Ce commentaire doit être la bonne réponse - Les assistants utilisent les valeurs POST en premier. Donc, si vous mettez à jour TheBool en postback et que vous affichez votre modèle sans faire de redirection/get, vous risquez d'afficher la mauvaise valeur. –

Répondre

13

1) utilisent différents (ids uniques)

2) ne pas utiliser cette aide, utilisez

<input type="hidden" name="the-name" 
    value="<%= Html.AttributeEncode(Model.TheBool) %>" id="TheBool_1216786" /> 
+0

L'ID est par exemple uniquement, défini automatiquement par l'assistant et n'a rien à voir avec le résultat. La question était: pourquoi les aides ne fonctionnent-elles pas comme prévu? – Martin

+0

Il est question qui devrait être adressée à MS, beaucoup de gens ont eu un comportement si étrange (j'ai trouvé à moins un le même problème demande de l'autre personne). J'ai essayé d'aider à le résoudre ou à l'éviter. Je ne travaille pas dans MS. :) Je n'ai pas de remerciements de votre part, donc je ne comprends pas pourquoi vous avez été si critique pour mon aide. – garik

+0

Je vous remercie d'essayer de m'aider. C'est juste que tu ne m'a pas aidé. En fait, vous n'avez fourni aucune information pertinente qui n'était pas déjà dans la question. Veuillez me diriger vers la question que vous avez mentionnée. – Martin

0

Voici un exemple rasoir:

html: 
@Html.HiddenFor(x => Model.TheBool, new { @id = "hdnBool" }) 

javascript: 
alert($('#hdnBool').val()); 

model: 
public class MyModel() 
{ 
    public bool TheBool{ get; set; } 
} 
0

Comme répondu here la Le problème est que les helpers HTML utilisent par défaut les valeurs affichées (si disponibles) puis se réfèrent au modèle. Personnellement, je ne pense pas que cela ait beaucoup de sens et je me demande maintenant combien d'autres bugs attendent sur notre plate-forme.

Quoi qu'il en soit, la solution a écrit dans la réponse ci-dessus va résoudre le problème, il suffit d'ajouter cette ligne avant votre retour du contrôleur:

ModelState.Remove("TheBool") 

Et oui, c'est un détritus peu parce que vous ne pouvez utiliser une chaîne référence ... mais ça marche.

+0

Oui - cela fonctionne mais je Knwo que dans les années à venir quand je regarde le code - je vais penser "pourquoi ai-je fait cela." – AntDC

+1

Je ne peux pas être plus d'accord et je recommande de tout coeur les commentaires libéraux autour de la soi-disant "solution".C'est cependant un déficit du cadre et un qui ne peut être évité sans un tel cludge; c'est-à-dire que le fait de surcharger OnActionExecute (ou un tel périphérique) dans le but d'automatiser cela conduirait à d'autres comportements et problèmes inattendus –

0

J'ai eu similaire et j'ai fini par le contourner comme ça. La situation est que l'utilisateur souhaite une sauvegarde puis confirmer le scénario sauver ....

J'ai choisi d'utiliser la solution ci-dessous plutôt que

ModelSate.Remove("OperationConfirmed"); 

(qui fonctionne) que je pense qu'il est plus intuative ....

@{ 
    string btnSaveCaption = "Save Changes"; 
    if (Model.OperationConfirmed) 
    { 
    btnSaveCaption = "Confirm Save Changes"; 
    @Html.Hidden("OperationConfirmed", true) 
    }   
}