2010-03-08 7 views
15

Che succede? La variabile viewmodel è un bool con valore true.Booleano con helper html Nascosto e nascostoPer

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

risultati in:

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

Che cosa sto facendo di sbagliato? Perché gli helper non funzionano come previsto?

+2

la risposta è nel http://stackoverflow.com/questions/4710447/asp-net-mvc-html-hiddenfor-with-wrong-value –

+0

Questo commento dovrebbe essere la risposta corretta - Gli helper utilizzano prima i valori POST. Quindi, se stai aggiornando TheBool sul postback e poi visualizzi il tuo modello senza fare un reindirizzamento/ottieni, potresti visualizzare il valore sbagliato. –

risposta

13

1) utilizzare diversi) id (uniche

2) non utilizzare questo helper, utilizzare

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

L'id è solo per esempio, impostato automaticamente dall'helper e non ha nulla a che fare con il risultato. La domanda era: perché gli aiutanti non funzionano come previsto? – Martin

+0

È una domanda che dovrebbe essere indirizzata alla SM, molte persone hanno un comportamento così strano (ho trovato a meno di uno stesso problema le richieste di altre persone). Ho provato ad aiutare come risolverlo o evitarlo. Non lavoro nella SM. :) Non ho alcun ringraziamento da parte tua, quindi non capisco perché sei così critico per il mio aiuto. – garik

+0

Apprezzo che tu abbia cercato di aiutarmi. È solo che non mi hai aiutato. Di fatto non hai fornito informazioni rilevanti che non erano già nella domanda. Per favore, indirizzami alla domanda che hai menzionato. – Martin

0

Ecco un esempio di rasoio:

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

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

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

come risposta here la il problema è che gli helper HTML di default usano i valori inviati (se disponibili) quindi si riferiscono al modello. Personalmente non penso che questo abbia un sacco di buonsenso e ora mi chiedo quanti altri bug sono in agguato per tutta la nostra piattaforma.

In ogni caso, la soluzione postato nella risposta citata risolverà il problema, è sufficiente aggiungere questa linea prima di tornare dal controller:

ModelState.Remove("TheBool") 

E sì, è un po 'spazzatura, perché si può usare solo una stringa riferimento ... ma funziona.

+0

Sì - questo funziona ma io che negli anni a venire guarderò il codice - penserò "perché l'ho fatto?" – AntDC

+1

Non posso essere più d'accordo e raccomanderei caldamente commenti liberali sulla cosiddetta "correzione".È tuttavia una mancanza del quadro e uno che non può essere evitato senza un simile cludge; vale a dire che ignorare OnActionExecute (o alcuni di questi dispositivi) nel tentativo di automatizzare ciò porterebbe solo a ulteriori comportamenti e problemi imprevisti –

0

Mi sono simile e ho finito per girarlo in questo modo. La situazione è che l'utente desidera un Salva e quindi confermare salvare scenario ....

ho scelto di utilizzare la soluzione qui di seguito, piuttosto che

ModelSate.Remove("OperationConfirmed"); 

(che funziona) come mi sento è più intuative ....

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