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

StackOverflow https://stackoverflow.com/questions/129335

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

Так:

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

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

Это было полезно?

Решение

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

Другие советы

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

[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, о чем и говорит ссылка, которую вы разместили в своем ответе.

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

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

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

ДЕЙСТВИЕ

TempData["datacontainer"] = modelData;

ВИД

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

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

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

Попробуй это

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

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

так

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

И Эли будет здесь, чтобы высказать идею о том, как сделать это универсальной переменной.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top