Ich habe ein Formular, das über jquery generiert wird:
%Vor%und es erzeugt dieses HTML (10 Zeilen mit Eingabefeldern, 7 Spalten und 1 Kontrollkästchen): Ссылка
und ich sende das Formular beim Klicken auf die Schaltfläche "Senden":
%Vor%Jetzt übergebe ich die Daten an meinen ASP.NET API Controller:
%Vor%und hier ist meine CellModel-Klasse:
%Vor%Mein Problem ist, wenn ich auf "submit" klicke, um die Daten zu senden und einen Haltepunkt auf die Controller-Methode zu setzen, die Anzahl der Zellen ist 0, gibt es etwas, das mir hier fehlt? Ich versuche, alle Daten im Eingangstext an den Controller zu übergeben. Nichts wird an meinen Controller weitergegeben. Was mache ich falsch?
Dies sind Daten, die versuchen, über jquery $ ('# form') zu übergeben. serialize ():
%Vor%AKTUALISIEREN
Ich habe mich geändert:
%Vor%bis
%Vor%In meinem Konsolenprotokoll sehen meine Daten so aus:
%Vor%und in meinem ASP.NET API Controller habe ich meine Methode folgendermaßen geändert:
%Vor% Ich gebe einen Breakpoint am Anfang der Methode Post und wenn es den Breakpoint trifft, sagt es Zellen Count = 0.Ich sehe Netzwerkaufruf, nur wenn ich eine Rückgabe falsch nach meinem Post-Aufruf und die Antwort ist leer []
Warum werden die Daten nicht an meinen Controller übergeben, weil das Formular von jquery generiert wird?
AKTUALISIEREN
Immer noch keine Lösung, schaute ich auf meinem Netzwerk Anruf dieses AM und der Statuscode ist 301:
Verwenden Sie nicht $ .post Verwende ajax post und setze den Inhaltstyp auf "application / json; charset = utf-8"
%Vor%Das Problem ist, dass Sie dem Webserver sagen müssen, dass Sie json senden und nicht mit $ .post
möglich istDas ist wirklich normal, und ich habe auch damit gekämpft (und manchmal vergesse ich immer noch), hier können Sie sehen, dass Sie $ .ajax
verwenden müssenJquery - Wie man $ .post () verwendet contentType = application / json?
Während du einen alternativen Ansatz von @dariogriffo hast, möchte ich dir eine vollständige Lösung geben, indem du deinen ersten Ansatz mit $ .post verwendest.
Ihre anfängliche Vorgehensweise mit der Formularserialisierung war korrekt, daher ist der folgende Code korrekt:
%Vor% Dies funktionierte jedoch nicht, da Ihr dynamisches Formular nicht den Benennungskonventionen für Eingabefelder entspricht, die vom ASP.NET MVC-Standardmodell-Binder erwartet werden, und folglich auch nicht für Ihr serialisiertes Formular etwas, das der Standardmodellbinder an Ihr cells
-Modell binden konnte. Deshalb haben Sie beim POST keine Zellen im Controller bekommen.
Um zu verdeutlichen, was das bedeutet, erwartet ASP.NET, dass jedes Eingabefeld, das einer Modelleigenschaft entspricht, das folgende Namensformat hat, wenn Sie auf einem normalen MVC 5-Controller veröffentlichen:
%Vor%Wenn Sie auf einem Web-API-2-Controller veröffentlichen, sollte es sein:
%Vor% Da Ihr Aktionsattribut den Namen cells
hat und eine Eigenschaft scheduledTaskID
hat und Sie auf einen WebAPI-Controller schreiben, würde eine Ihrer Eingaben wie folgt aussehen:
Bei der Strukturierung eines Formulars gibt es noch ein paar weitere Regeln, um es bindbar zu machen. Sie können hier einen schönen Blogeintrag finden:
Wenn Sie diese Formularkonvention befolgt haben, können Sie Ihr serialisiertes Formular auf Ihrem Controller mit einem List<CellModel> cells
versehen, ohne den JSON-Ansatz verwenden zu müssen, der viel teurer ist, wie in der andere Antworten.
Im Folgenden finden Sie eine Fiddle mit einem Beispielformular, das von den Standardbinderregeln für Web-API 2 korrekt strukturiert ist:
Sie können versuchen, $ .post dieses Formular mit $ .post zu Ihrem Web-API-Controller und es sollte wie ein Charme funktionieren!
Ich weiß, das ist bereits gelöst mit .ajax
anstelle von .post
. Ich dachte daran, dies zu teilen, da ich dies mit .post
gelöst habe. Wie oben erwähnt, enthält der Parameter Content-Type:application/x-www-form-urlencoded; charset=UTF-8
in der post-Methode cells
.
Um dieses Problem zu lösen, müssen Sie das Anforderungsobjekt manuell erfassen und Post-Daten abrufen und dann deserialisieren und das Objekt als count = 0
abrufen. Ich habe den gesamten geposteten Code von OP benutzt und nur List<CellModel>
method wie im folgenden Beispiel geändert, und es hat funktioniert.
Hier ist, was ich beim Debuggen bekomme.
Tags und Links asp.net-mvc c# jquery asp.net