Как вы перенаправляете на страницу, используя глагол 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. Кто-нибудь знает как это сделать?

8 ответов

Решение

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;

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

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

Я только что испытал ту же проблему.

Решение состояло в том, чтобы вызвать действие контроллера как функцию

        return await ResendConfirmationEmail(new ResendConfirmationEmailViewModel() { Email = input.Email });


 [HttpPost]
        [AllowAnonymous]
        public async Task<IActionResult> ResendConfirmationEmail(ResendConfirmationEmailViewModel input)
        {
           ...

            return View("ResendConfirmationEmailConfirmed");
        }

Здесь мы меняем ответ PowerMan на прямой вызов функции внутри того же контроллера.

Контроллер 1:

      return RedirectToAction("Index2", 
"CustomerGuestLogin", 
new CustomerGuestModel() { Email = model.Email, Password = model.Password });

Контроллер 2:

          [HttpGet]
    public ActionResult Index2(CustomerGuestModel e)
    {
        return this.Index(e);
    }

    [HttpPost]
    public ActionResult Index(CustomerGuestModel e)
    {
        string status = "";
        if (!string.IsNullOrEmpty(e.Email) &&                         
        !string.IsNullOrEmpty(e.Password)) { 
               //do something
        }
     }

Попробуйте это: Ваш взгляд со страницы 1

      <form method="post">
  <input name="text" />
  <button type="submit">Send</button>
</form>

Под вашим контролем со страницы 1

      public IActionResult OnPost(string text){
  return RedirectToPagePreserveMethod("Page2");
}

Под вашим контролем со страницы 2

      public IActionResult OnPost(string text){
      ViewData["text"] = text;
      return Page();
    }

Ваш взгляд со страницы 2

      <h1>@ViewData["Text"]</h1>

Я пробовал в .NetCore 6

Другие вопросы по тегам