Gdy wywołujesz RedirectToAction
w kontrolerze, automatycznie przekierowuje przy użyciu protokołu HTTP GET. Jak wyraźnie powiedzieć mu, aby używał POST protokołu HTTP?
Mam akcję, która akceptuje zarówno żądania GET, jak i POST, i chcę mieć możliwość RedirectToAction
korzystania z POST i wysyłania do niej pewnych wartości.
Lubię to:
this.RedirectToAction(
"actionname",
new RouteValueDictionary(new { someValue = 2, anotherValue = "text" })
);
Chcę, aby wartości someValue
i anotherValue
były wysyłane przy użyciu protokołu HTTP POST zamiast GET. Czy ktoś wie, jak to zrobić?
asp.net-mvc
url-redirection
Chris Pietschmann
źródło
źródło
Odpowiedzi:
HTTP nie obsługuje przekierowania do strony używającej POST. Kiedy gdzieś przekierowujesz, nagłówek HTTP „Lokalizacja” informuje przeglądarkę, dokąd się udać, a przeglądarka wysyła żądanie GET dla tej strony. Prawdopodobnie będziesz musiał po prostu napisać kod strony, aby akceptować żądania GET, a także żądania POST.
źródło
Dla twojego konkretnego przykładu zrobiłbym to po prostu, ponieważ oczywiście nie obchodzi Cię fakt, że przeglądarka i tak otrzyma przekierowanie (z racji zaakceptowania odpowiedzi, którą już zaakceptowałeś):
[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(); }
To działa łatwo i tak naprawdę nie dzieje się nic zabawnego - pozwala to zachować fakt, że druga z nich naprawdę akceptuje tylko żądania HTTP POST (z wyjątkiem tego przypadku, który i tak jest pod Twoją kontrolą) i nie musisz tego robić użyj również TempData, co sugeruje link, który zamieściłeś w swojej odpowiedzi.
Chciałbym wiedzieć, co jest w tym „nie tak”, jeśli jest coś. Oczywiście, jeśli naprawdę chcesz wysłać do przeglądarki przekierowanie, to nie zadziała, ale wtedy powinieneś zapytać, dlaczego próbowałbyś to przekonwertować, skoro wydaje mi się to dziwne.
Mam nadzieję, że to pomoże.
źródło
Jeśli chcesz przekazać dane między dwiema akcjami podczas przekierowania bez uwzględniania żadnych danych w ciągu zapytania, umieść model w obiekcie TempData.
AKCJA
TempData["datacontainer"] = modelData;
WIDOK
var modelData= TempData["datacontainer"] as ModelDataType;
TempData ma być instancją krótkotrwałą i należy jej używać tylko podczas bieżącego i kolejnych żądań! Ponieważ TempData działa w ten sposób, musisz wiedzieć na pewno, jakie będzie następne żądanie, a przekierowanie do innego widoku jest jedynym momentem, w którym możesz to zagwarantować.
Dlatego jedynym scenariuszem, w którym korzystanie z TempData będzie niezawodne, jest przekierowanie.
źródło
Spróbuj tego
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>");
źródło
Chciałbym rozszerzyć odpowiedź Jasona Buntinga
lubię to
ActionResult action = new SampelController().Index(2, "text"); return action;
Eli przyjedzie po pomysł, jak uczynić to zmienną ogólną
Może uzyskać wszystkie typy kontrolerów
źródło
new ...()
ponieważ straciszRequestContext
- jeśli jesteś już w tym samym kontrolerze, może nie być konieczne tworzenie nowej instancji. W przeciwnym razie postępuj w następujący sposób:SampelController sampleController = DependencyResolver.Current.GetService<SampelController>()
wtedy:sampleController.ControllerContext = new ControllerContext(Request.RequestContext, sampleController);
wtedy możeszreturn sampleController.Index(2, "text");
Tylko podpowiedź :)