Как вы перенаправляете на страницу, используя глагол POST? - PullRequest
118 голосов
/ 24 сентября 2008

Когда вы вызываете RedirectToAction внутри контроллера, он автоматически перенаправляется с использованием HTTP GET. Как явно указать ему использовать HTTP POST?

У меня есть действие, которое принимает запросы GET и POST, и я хочу иметь возможность RedirectToAction использовать POST и отправить ему некоторые значения.

Как это:

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

Я хочу, чтобы значения someValue и anotherValue отправлялись с использованием HTTP POST вместо GET. Кто-нибудь знает, как это сделать?

Ответы [ 5 ]

149 голосов
/ 27 августа 2009

Для вашего конкретного примера я бы просто сделал это, так как вы, очевидно, не заботитесь о том, чтобы браузер все равно получал перенаправление (в силу принятия ответа, который вы уже приняли):

[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();
}

Это работает легко, и на самом деле ничего смешного не происходит - это позволяет вам поддерживать тот факт, что второй действительно принимает только запросы HTTP POST (кроме этого случая, который в любом случае находится под вашим контролем), и вы не Вам также не нужно использовать TempData, о чем говорит ссылка, которую вы опубликовали в своем ответе.

Я бы хотел знать, что с этим не так, если есть что-нибудь. Очевидно, что если вы действительно хотите отправить в браузер перенаправление, это не сработает, но тогда вам следует спросить, почему вы пытаетесь преобразовать это независимо, поскольку мне это кажется странным.

Надеюсь, это поможет.

94 голосов
/ 24 сентября 2008

HTTP не поддерживает перенаправление на страницу с помощью POST. Когда вы куда-то перенаправляете, HTTP-заголовок «Location» сообщает браузеру, куда идти, и браузер делает GET-запрос для этой страницы. Возможно, вам придется просто написать код для своей страницы, чтобы принимать запросы GET, а также запросы POST.

18 голосов
/ 15 октября 2013

Если вы хотите передавать данные между двумя действиями во время перенаправления без включения каких-либо данных в строку запроса, поместите модель в объект TempData.

АКЦИЯ

TempData["datacontainer"] = modelData;

VIEW

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

TempData предназначен для очень кратковременного экземпляра, и вы должны использовать его только во время текущего и последующих запросов! Поскольку TempData работает таким образом, вам необходимо точно знать, каким будет следующий запрос, и перенаправление в другое представление - единственный раз, когда вы можете гарантировать это.

Следовательно, единственный сценарий, когда использование TempData будет надежно работать, - это когда вы перенаправляете.

7 голосов
/ 27 апреля 2015

попробуйте это

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>");
4 голосов
/ 14 июня 2016

Я хотел бы расширить ответ Джейсона Бантинга

как это

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

И Илай найдет здесь идею, как сделать ее универсальной переменной

Может получить все типы контроллеров

...