webentwicklung-frage-antwort-db.com.de

Wie leiten Sie mit dem Verb POST?

Wenn Sie RedirectToAction innerhalb eines Controllers aufrufen, wird die Weiterleitung automatisch mithilfe eines HTTP-GET durchgeführt. Wie sage ich ausdrücklich, dass ein HTTP-POST verwendet werden soll?

Ich habe eine Aktion, die sowohl GET- als auch POST - Anforderungen akzeptiert, und ich möchte in der Lage sein, RedirectToAction mit POST zu verwenden und einige Werte zu senden .

So was:

this.RedirectToAction(
    "actionname",
    new RouteValueDictionary(new { someValue = 2, anotherValue = "text" })
);

Ich möchte, dass die Werte someValue und anotherValue über HTTP gesendet werden POST anstelle von GET. Weiß jemand, wie das geht?

120

HTTP unterstützt die Weiterleitung zu einer Seite mit POST nicht. Wenn Sie irgendwohin umleiten, teilt der HTTP-Header "Location" dem Browser mit, wohin er gehen soll, und der Browser sendet eine GET-Anforderung für diese Seite. Sie müssen wahrscheinlich nur den Code für Ihre Seite schreiben, um GET-Anforderungen sowie POST Anforderungen zu akzeptieren.

96
Eli Courtwright

Für Ihr spezielles Beispiel würde ich dies einfach tun, da es Ihnen offensichtlich egal ist, ob der Browser die Weiterleitung tatsächlich erhält (durch Akzeptieren der Antwort, die Sie bereits akzeptiert haben):

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index() {
   // obviously these values might come from somewhere non-trivial
   return Index(2, "text");
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(int someValue, string anotherValue) {
   // would probably do something non-trivial here with the param values
   return View();
}

Das funktioniert problemlos und es gibt kein wirklich lustiges Geschäft - dies ermöglicht Ihnen, die Tatsache beizubehalten, dass das zweite wirklich nur HTTP POST Requests akzeptiert (außer in diesem Fall, der unter Ihrer Kontrolle steht) und Sie müssen auch nicht TempData verwenden, was der Link, den Sie in Ihrer Antwort gepostet haben, andeutet.

Ich würde gerne wissen, was daran "falsch" ist, wenn es etwas gibt. Wenn Sie wirklich eine Weiterleitung an den Browser senden möchten, funktioniert dies natürlich nicht, aber Sie sollten sich fragen, warum Sie versuchen würden, dies trotzdem zu konvertieren, da es für mich seltsam erscheint.

Hoffentlich hilft das.

151
Jason Bunting

Wenn Sie während einer Umleitung Daten zwischen zwei Aktionen übergeben möchten, ohne Daten in die Abfragezeichenfolge aufzunehmen, fügen Sie das Modell in das TempData-Objekt ein.

AKTION

TempData["datacontainer"] = modelData;

AUSSICHT

var modelData= TempData["datacontainer"] as ModelDataType; 

TempData soll eine sehr kurzlebige Instanz sein, und Sie sollten es nur während der aktuellen und der nachfolgenden Anforderungen verwenden! Da TempData auf diese Weise funktioniert, müssen Sie genau wissen, wie die nächste Anforderung aussehen wird, und Sie können dies nur dann garantieren, wenn Sie zu einer anderen Ansicht umleiten.

Daher ist das einzige Szenario, in dem die Verwendung von TempData zuverlässig funktioniert, das Umleiten.

18
Otto Kanellis

probier diese

return Content("<form action='actionname' id='frmTest' method='post'><input type='hidden' name='someValue' value='" + someValue + "' /><input type='hidden' name='anotherValue' value='" + anotherValue + "' /></form><script>document.getElementById('frmTest').submit();</script>");
7
vicky

Ich möchte die Antwort von Jason Bunting erweitern

so was

ActionResult action = new SampelController().Index(2, "text");
return action;

Und Eli wird hier sein, um eine Idee zu haben, wie man es generisch variabel machen kann

Kann alle Arten von Controller erhalten

4