Как перенаправить действие в ASP.NET MVC без потери данных запроса
-
08-06-2019 - |
Вопрос
Использование ASP.NET MVC существуют ситуации (например, отправка формы), которые могут потребовать RedirectToAction
.
Одна из таких ситуаций заключается в том, что вы сталкиваетесь с ошибками проверки после отправки формы и вам необходимо перенаправить обратно на форму, но хотелось бы, чтобы URL-адрес отражал URL-адрес формы, а не страницу действия, на которую она отправляется.
Поскольку я требую, чтобы форма содержала исходное POST
отредактированные данные, для удобства пользователя, а также в целях проверки, как я могу передать данные через RedirectToAction()
?Если я использую параметр ViewData, мой POST
параметры будут изменены на GET
параметры.
Решение
Решение состоит в том, чтобы использовать свойство TempData для хранения нужных компонентов запроса.
Например:
public ActionResult Send()
{
TempData["form"] = Request.Form;
return this.RedirectToAction(a => a.Form());
}
Затем в своем действии "Форма" вы можете перейти:
public ActionResult Form()
{
/* Declare viewData etc. */
if (TempData["form"] != null)
{
/* Cast TempData["form"] to
System.Collections.Specialized.NameValueCollection
and use it */
}
return View("Form", viewData);
}
Другие советы
Имейте в виду, что TempData хранит коллекцию форм в сеансе.Если вам не нравится такое поведение, вы можете реализовать новый интерфейс ITempDataProvider и использовать какой-либо другой механизм для хранения временных данных.Я бы не стал этого делать, если бы вы точно не знали (посредством измерения и профилирования), что использование состояния сеанса причиняет вам вред.
Взгляните на MVCКонтриб, ты можешь сделать это:
using MvcContrib.Filters;
[ModelStateToTempData]
public class MyController : Controller {
//
...
}
Существует другой способ, который позволяет избежать tempdata.Шаблон, который мне нравится, включает в себя создание 1 действия как для исходного рендеринга, так и для повторного рендеринга недопустимой формы.Это звучит примерно так:
var form = new FooForm();
if (request.UrlReferrer == request.Url)
{
// Fill form with previous request's data
}
if (Request.IsPost())
{
if (!form.IsValid)
{
ViewData["ValidationErrors"] = ...
} else {
// update model
model.something = foo.something;
// handoff to post update action
return RedirectToAction("ModelUpdated", ... etc);
}
}
// By default render 1 view until form is a valid post
ViewData["Form"] = form;
return View();
Это более или менее закономерность.Маленький псевдой.С помощью этого вы можете создать 1 представление для обработки рендеринга формы, повторного отображения значений (поскольку форма будет заполнена предыдущими значениями) и отображения сообщений об ошибках.
При проводке к этому действию, если оно допустимо, оно передает управление другому действию.
Я пытаюсь упростить этот шаблон в платформа проверки .net по мере того, как мы наращиваем поддержку MVC.
Если вы хотите передать данные перенаправленному действию, вы могли бы использовать следующий метод:
return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like public ActionResult ModelUpdated(int id);