Was Sie sehen, ist das erwartete Verhalten, weil Http staatenlos ist.
Jedes Mal, wenn Sie Ihre Aktionsmethode aufrufen, wird ein neues Objekt des Controllers erstellt. Also in Ihrem Fall, wenn Sie den Ajax-Aufruf machen, wird es ein neues Objekt der DrawingController
erstellen und dieses Objekt wird eine Eigenschaft des Typs Plate
haben, aber ist nicht auf ein Plate
Objekt initialisiert. (die Sie in Ihrem Index
Methodenaufruf tun)
Wenn Sie die gleiche Platte Instanz erhalten mögen, in Ihrer PassCoordinates
Aktion Methode, die Sie auf unterschiedliche Weise tun können
Haben Sie Ihren Beitrag Ajax-Aufruf der js Objekt der Plattenstruktur und haben einen Parameter in Ihrer Aktionsmethode von Plate
Typ. Wenn die Anforderung gesendet wird, kann der Modellbinder das neue Objekt erstellen und die Werte der verschiedenen Projekte abbilden
Speichern Sie das Plate-Objekt in einem persistenten Medium und lesen Sie es. In Ihrer Index-Aktionsmethode erstellen Sie das Objekt, initialisieren die property-Werte und speichern es in einer db-Tabelle/einem Session-Zustand usw. Sie können es an dieser Stelle in Ihrer zweiten Aktionsmethode erneut lesen. eine statische Variable ist eine weitere Option
Wenn Sie die Option # 2 und wählen gehen Session/statische Variable zu verwenden, denken Sie daran, dass Sie Stateful Verhalten an den stateless http hinzufügen möchten. :(
IMHO, Option 1 ist der Weg zu gehen. das staatenlos Verhalten von Http halten. Haben Sie Ihren Client-Code (der Code, der die Ajax-Aufruf macht) senden, um die JS Objekt, das die Platte Objekt und haben das Modell Binder bauen das Objekt für Sie
Wenn ich Ihren Code anschaue, ist die einzige Sache, die PassCoordinates
Methode tut, einfach die Holes.coordinates
Eigenschaft Wert des Plate-Objekts (die Sie zwar in der Steuerung verfügbar sein werden). Sie können diese Methode vollständig entfernen und sicherstellen, dass Sie dies in den Eingabeelementen in Ihrem Formular ausführen. Wenn Sie das Formular an die Indexaktionsmethode HttpPost übergeben, ist sie im Anforderungshauptteil und in der Modellbindung verfügbar Er wird es Ihrem Plattenparameter zuordnen.
@model Plate
@using (Html.BeginForm("Index", "Home"))
{
@Html.TextBoxFor(a=>a.Holes.coordinates)
<button type="submit" class="btn" >Save</button>
}
Dies wird ein Eingangselement mit dem Namen Holes.coordinates
in dem Formular erstellen.
<input id="Holes_coordinates" name="Holes.coordinates" type="text" value="">
Geben Sie einen Wert ein und senden Sie das Formular ab. Wenn Sie jetzt in der Aktionsmethode HttpPost einen Haltepunkt setzen, können Sie sehen, dass Ihre Blechobjekte Loch propty gefüllt sind und Sie auf den Wert zugreifen können, den Sie in das Textfeld in der Eigenschaft coordinates
eingegeben haben.
Jetzt alles, was Sie tun müssen, ist, was auch immer clientseitiger Code den Ajax-Anruf machte, anstatt den Ajax-Anruf zu machen, setzen Sie den Wert dieser Eingabe.
$("#Holes_coordinates").val("some value you want");
Wenn alles funktioniert, können Sie das sichtbare Textfeld zu einem versteckten Eingang durch einfaches Umschalten den Aufrufs HiddenFor
Helfer konvertieren.
@Html.HiddenFor(a=>a.Holes.coordinates)
Sie können 'Platte' als statische Variable festlegen, dann wird sie beibehalten. Aber selbst dann wirst du hier ernsthafte Probleme mit den Race Conditions haben. Normalerweise bedeutet das Speichern von Werten, dass sie über eine Art Datenbank oder Caching-Mechanismus bestehen bleiben. – nurdyguy
Warum gibt es 2 Post-Methoden? Können Sie Ihre Index.cshtml bereitstellen? – 0014
@ 0014, 'PassCoordinates (Stringkoordinaten)' wird von ajax aufgerufen und 'Index (Plate plate)' wird am Formular submit aufgerufen. – user3453636