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?
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.
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.
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.
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>");
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