Как вы перенаправляетесь на страницу с помощью глагола POST?

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

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

Вот так:

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

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

Ответ 1

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

Ответ 2

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

[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 (за исключением этого экземпляра, который находится под вашим контролем в любом случае) t должен также использовать TempData, что и указывает ссылка, которую вы указали в своем ответе.

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

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

Ответ 3

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

ACTION

TempData["datacontainer"] = modelData;

VIEW

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

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

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

Ответ 4

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

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

Ответ 5

Ответ, написанный Джейсоном, будет работать в большинстве сценариев, единственная проблема, которую я вижу, - это то, что она подвержена несчастным случаям. т.е. вызов метода действия непосредственно обходит все фильтры, применяемые к действию. Таким образом, в случае, если для метода действия существует какой-либо фильтр проверки подлинности или счетчика, эти данные могут быть потеряны. Вызов метода действия напрямую будет работать, но его следует применять осторожно.

Ответ 6

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

как это

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

И Эли будет здесь для чего-то идеи о том, как сделать его общей переменной

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