2010-03-08 6 views
15

Was ist los? Die Variable viewmodel ist ein Bool mit dem Wert true.Boolean mit HTML-Helfer Versteckt und VerstecktFür

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

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

Was mache ich falsch? Warum arbeiten die Helfer nicht wie beabsichtigt?

+2

die Antwort ist in http://stackoverflow.com/questions/4710447/asp-net-mvc-html-hiddenfor-with-wrong-value –

+0

Dieser Kommentar sollte die richtige Antwort sein - Helfer verwenden zuerst POST-Werte. Wenn Sie also TheBool beim Postback aktualisieren und dann Ihr Modell anzeigen, ohne eine Redirect/Get auszuführen, wird möglicherweise der falsche Wert angezeigt. –

Antwort

13

1) verwenden unterschiedliche (unique) ids

2) nicht über diese Helfer verwenden,

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

Die ID ist nur Beispiel, wird vom Helfer automatisch gesetzt und hat nichts mit dem Ergebnis zu tun. Die Frage war: Warum arbeiten die Helfer nicht wie beabsichtigt? – Martin

+0

Es ist eine Frage, die an MS gerichtet werden sollte, viele Leute haben so seltsames Verhalten (ich fand bei weniger ein und demselben Problem Anfragen von anderer Person). Ich habe versucht zu helfen, wie man es löst oder vermeidet. Ich arbeite nicht in MS. :) Ich habe keinen Dank von dir, deshalb verstehe ich nicht, warum du so kritisch zu meiner Hilfe bist. – garik

+0

Ich schätze es, dass Sie versuchen, mir zu helfen. Es ist nur so, dass du mir nicht geholfen hast. Tatsächlich haben Sie keine relevanten Informationen zur Verfügung gestellt, die nicht bereits in der Frage enthalten waren. Bitte richten Sie mich auf die Frage, die Sie erwähnt haben. – Martin

0

Hier ist ein Beispiel in Rasiermesser:

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

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

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

Wie beantwortet here die Problem ist, dass HTML-Helfer standardmäßig die gebuchten Werte verwenden (sofern verfügbar) und dann auf das Modell verweisen. Persönlich denke ich nicht, dass dies eine ganze Menge Sinn macht und frage mich nun, wie viele andere Fehler auf unserer Plattform lauern.

Wie auch immer, die Lösung in der oben erwähnten Antwort gepostet wird das Problem lösen, fügen Sie einfach diese Zeile, bevor Sie von der Steuerung zurück:

ModelState.Remove("TheBool") 

Und ja, es ist ein Müll etwas, weil Sie nur eine Zeichenfolge verwenden können, Referenz ... aber es funktioniert.

+0

Ja - das funktioniert aber ich Ich weiß, dass ich in den kommenden Jahren, wenn ich mir den Code anschaue, denke, "warum habe ich das getan?" – AntDC

+1

Ich kann nicht mehr zustimmen und würde uneingeschränkt liberale Kommentare rund um das sogenannte "Fix" empfehlen.Es ist jedoch ein Defizit des Rahmens und eines, das ohne einen solchen Cludge nicht vermieden werden kann; Das heißt, dass das Überschreiben von OnActionExecute (oder eines ähnlichen Geräts) bei dem Versuch, dies zu automatisieren, nur zu weiteren unerwarteten Verhaltensweisen und Problemen führen würde –

0

Ich hatte ähnliches und endete damit, es so zu bekommen. Die Situation ist der Benutzer ein Speichern will und dann bestätigen Szenario speichern ....

wählte ich eher die Lösung unten zu verwenden, als

ModelSate.Remove("OperationConfirmed"); 

(was funktioniert), wie ich fühle es mehr intuative ist ....

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