Ich erstelle eine kleine App, um mir ASP.NET MVC und JQuery beizubringen, und eine der Seiten enthält eine Liste von Elementen, in denen einige ausgewählt werden können. Dann möchte ich einen Knopf drücken und eine Liste (oder etwas Ähnliches) an meinen Controller senden, die die IDs der ausgewählten Elemente enthält, und zwar mithilfe der Post-Funktion von JQuery.
Ich habe es geschafft, ein Array mit den IDs der ausgewählten Elemente zu erhalten, und jetzt möchte ich das veröffentlichen. Eine Möglichkeit, dies zu tun, besteht darin, auf meiner Seite ein Dummy-Formular mit einem ausgeblendeten Wert zu haben und dann den ausgeblendeten Wert mit den ausgewählten Elementen festzulegen und dieses Formular zu veröffentlichen. das sieht allerdings mürrisch aus.
Gibt es eine sauberere Möglichkeit, dies zu erreichen, indem das Array direkt an die Steuerung gesendet wird? Ich habe ein paar verschiedene Dinge ausprobiert, aber es sieht so aus, als ob der Controller die empfangenen Daten nicht zuordnen kann. Hier ist der Code bisher:
function generateList(selectedValues) {
var s = {
values: selectedValues //selectedValues is an array of string
};
$.post("/Home/GenerateList", $.toJSON(s), function() { alert("back") }, "json");
}
Und dann sieht mein Controller so aus
public ActionResult GenerateList(List<string> values)
{
//do something
}
Alles, was ich bekommen habe, ist eine "Null" im Controller-Parameter ...
Irgendwelche Tipps?
quelle
Request["values[]"]
Antworten:
Ich habe meine Antwort so geändert, dass sie den Code für eine Test-App enthält, die ich erstellt habe.
Update: Ich habe die jQuery aktualisiert, um die 'traditionelle' Einstellung auf true zu setzen, damit dies wieder funktioniert (gemäß der Antwort von @DustinDavis).
Zuerst das Javascript:
Und hier ist der Code in meiner Controller-Klasse:
Wenn ich diese Javascript-Funktion aufrufe, erhalte ich eine Warnung mit der Aufschrift "Erstes Element in der Liste: 'Element1'". Hoffe das hilft!
quelle
dataType: 'JSON'
dass jQuery versucht, die Antwort als JSON zu analysieren, und dass ein Fehler auftritt, wenn JSON nicht gültig ist.dataType: 'json'
ist für den Rückgabetyp und muss kein Array an Action senden.contentType: "application/json; charset=utf-8"
ist die eine, aber in einigen Fällen ist dies nicht erforderlich.var postData = { id: 45, [{myClassProp1: 1, myClassProp2: 2}, {}...], anotherParam: "some string" };
Zu Ihrer Information: JQuery hat die Art und Weise geändert, wie Post-Daten serialisiert werden.
http://forum.jquery.com/topic/nested-param-serialization
Sie müssen die Einstellung "Traditionell" auf "wahr" setzen, andernfalls
wird als herauskommen
anstatt
quelle
$.ajax({ ..., traditional: true});
hilft dabei, zur herkömmlichen Serialisierung zurückzukehren.ints
. Wenn ich es benutzetraditional: true
, funktioniert es. Ihre Antwort und Ihr Link erklären das Warum . Es funktioniert auch, wenn ich es benutzetype: "POST"
, ohne es zu benutzentraditional: true
. Warum ist das so? Könnten Sie bitte näher darauf eingehen? Zu Ihrer Information Ich benutze Asp.Net Mvc.Vielen Dank an alle für die Antworten. Eine weitere schnelle Lösung besteht darin, die Methode jQuery.param mit dem traditionellen Parameter true zu verwenden, um das JSON-Objekt in einen String zu konvertieren:
quelle
Veröffentlichen Sie die Daten nicht als Array. Um an eine Liste zu binden, sollten die Schlüssel / Wert-Paare für jeden Schlüssel mit demselben Wert gesendet werden.
Sie sollten dazu kein Formular benötigen. Sie benötigen lediglich eine Liste von Schlüssel / Wert-Paaren, die Sie in den Aufruf von $ .post aufnehmen können.
quelle
In
.NET4.5
,MVC 5
Javascript:
Objekt in JS:
Mechanismus, der postet.
C #
Objekte:
Regler:
Objekt erhalten:
Hoffe das spart dir etwas Zeit.
quelle
Eine weitere Implementierung, die auch mit der Liste von Objekten arbeitet, nicht nur mit Zeichenfolgen:
JS:
Angenommen, 'selectedValues' ist ein Array von Objekten.
In der Steuerung ist der Parameter eine Liste der entsprechenden ViewModels.
quelle
Wie ich hier besprochen habe ,
Wenn Sie ein benutzerdefiniertes JSON-Objekt an eine MVC-Aktion übergeben möchten, können Sie diese Lösung verwenden. Sie funktioniert wie ein Zauber.
Der eigentliche Vorteil dieser Lösung besteht darin, dass Sie nicht für jede Kombination von Argumenten eine neue Klasse definieren müssen. Außerdem können Sie Ihre Objekte problemlos in ihre ursprünglichen Typen umwandeln.
Sie können eine Hilfsmethode wie diese verwenden, um Ihre Arbeit zu erleichtern:
quelle
Sie können globale Parameter mit einrichten
quelle
Die Antwort hat mir in meiner Situation sehr geholfen, also danke dafür. Für zukünftige Referenzzwecke sollten sich die Benutzer jedoch an ein Modell binden und dann validieren. Dieser Beitrag von Phil Haack beschreibt dies für MVC 2. http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx
Hoffe das hilft jemandem.
quelle