Ich verwende MVC 3 in meinem Projekt und sehe ein sehr seltsames Verhalten.
Ich versuche, ein verstecktes Feld für einen bestimmten Wert in meinem Modell zu erstellen. Das Problem besteht darin, dass der auf dem Feld festgelegte Wert aus irgendeinem Grund nicht dem Wert im Modell entspricht.
z.B
Ich habe diesen Code nur als Test:
<%:Html.Hidden("Step2", Model.Step) %>
<%:Html.HiddenFor(m => m.Step) %>
Ich würde denken, dass beide versteckten Felder den gleichen Wert haben würden. Ich setze den Wert beim ersten Anzeigen der Ansicht auf 1 und erhöhe dann nach der Übermittlung den Wert des Felds Modell um 1.
Wenn ich die Seite zum ersten Mal rendere, haben beide Steuerelemente den Wert 1, aber beim zweiten Mal sind die gerenderten Werte folgende:
<input id="Step2" name="Step2" type="hidden" value="2" />
<input id="Step" name="Step" type="hidden" value="1" />
Wie Sie sehen können, ist der erste Wert korrekt, aber der zweite Wert scheint der gleiche zu sein wie beim ersten Anzeigen der Ansicht.
Was vermisse ich? Zwischenspeichern die * For Html-Helfer die Werte auf irgendeine Weise? Wenn ja, wie kann ich dieses Caching deaktivieren?
Danke für Ihre Hilfe.
Antworten:
Das ist normal und so funktionieren HTML-Helfer. Sie verwenden zuerst den Wert der POST-Anforderung und danach den Wert im Modell. Dies bedeutet, dass selbst wenn Sie den Wert des Modells in Ihrer Controller-Aktion ändern, wenn dieselbe Variable in der POST-Anforderung vorhanden ist, Ihre Änderung ignoriert wird und der POST-Wert verwendet wird.
Eine mögliche Problemumgehung besteht darin, diesen Wert in der Controller-Aktion, die versucht, den Wert zu ändern, aus dem Modellstatus zu entfernen:
Eine andere Möglichkeit besteht darin, einen benutzerdefinierten HTML-Helfer zu schreiben, der immer den Wert des Modells verwendet und POST-Werte ignoriert.
Und noch eine Möglichkeit:
quelle
Beim Schreiben eines Assistenten, der bei jedem Schritt verschiedene Teile eines größeren Modells anzeigt, ist dasselbe Problem aufgetreten.
Daten und / oder Fehler aus "Schritt 1" würden mit "Schritt 2" usw. verwechselt, bis mir schließlich klar wurde, dass ModelState "schuld" war.
Das war meine einfache Lösung:
quelle
ModelState.Clear()
löste mein Problem mit sequentiellen POST-Anfragen in einer ähnlichen Situation.Dieser Code funktioniert nicht
... weil HiddenFor immer (!) aus ModelState liest, nicht das Modell selbst. Wenn der "Schritt" -Schlüssel nicht gefunden wird, wird der Standardwert für diesen Variablentyp erstellt, der in diesem Fall 0 ist
Hier ist die Lösung. Ich habe es für mich selbst geschrieben, aber es macht mir nichts aus, es zu teilen, weil ich sehe, dass viele Leute mit diesem ungezogenen HiddenFor-Helfer zu kämpfen haben.
Dann verwenden Sie es einfach wie gewohnt aus Ihrer Sicht:
Erwähnenswert ist, dass es auch mit Sammlungen funktioniert.
quelle
Ich habe zu viele Probleme mit der gleichen Situation, in der ich zwischen Aufrufen denselben Modellstatus verwende und wenn ich eine Modelleigenschaft im Backend ändere. Es ist mir jedoch egal, ob ich textboxfor oder hiddenfor verwende.
Ich umgehe die Situation einfach, indem ich Seitenskripte verwende, um den Modellwert als js-Variable zu speichern, da ich zu Beginn das versteckte Feld für diesen Zweck benötige.
Ich bin mir nicht sicher, ob dies hilft, aber denke nur darüber nach.
quelle