Как вы перенаправляетесь на страницу с помощью глагола 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;
И Эли будет здесь для чего-то идеи о том, как сделать его общей переменной
Можно получить все типы контроллеров