В ASP.NET MVC в основном есть 3 метода для реализации шаблона PRG .
Использование TempData
действительно является одним из способов передачи информации для одного перенаправления. Недостаток, который я вижу в этом подходе, заключается в том, что если пользователь нажмет F5 на последней перенаправленной странице, он больше не сможет получать данные, так как они будут удалены из TempData
для последующих запросов:
[HttpPost]
public ActionResult SubmitStudent(StudentResponseViewModel model)
{
if (!ModelState.IsValid)
{
// The user did some mistakes when filling the form => redisplay it
return View(model);
}
// TODO: the model is valid => do some processing on it
TempData["model"] = model;
return RedirectToAction("DisplayStudent");
}
[HttpGet]
public ActionResult DisplayStudent()
{
var model = TempData["model"] as StudentResponseViewModel;
return View(model);
}
Другой подход, если у вас мало данных для отправки, это отправлять их в виде параметров строки запроса, например:
[HttpPost]
public ActionResult SubmitStudent(StudentResponseViewModel model)
{
if (!ModelState.IsValid)
{
// The user did some mistakes when filling the form => redisplay it
return View(model);
}
// TODO: the model is valid => do some processing on it
// redirect by passing the properties of the model as query string parameters
return RedirectToAction("DisplayStudent", new
{
Id = model.Id,
Name = model.Name
});
}
[HttpGet]
public ActionResult DisplayStudent(StudentResponseViewModel model)
{
return View(model);
}
Еще один подход, и, на мой взгляд, лучший состоит в том, чтобы сохранить эту модель в некотором хранилище данных (например, в базе данных или чем-то еще), а затем, когда вы хотите перенаправить на действие GET, отправьте только идентификатор, позволяющий ему извлекать модель из любой точки мира. сохранил это). Вот образец:
[HttpPost]
public ActionResult SubmitStudent(StudentResponseViewModel model)
{
if (!ModelState.IsValid)
{
// The user did some mistakes when filling the form => redisplay it
return View(model);
}
// TODO: the model is valid => do some processing on it
// persist the model
int id = PersistTheModel(model);
// redirect by passing the properties of the model as query string parameters
return RedirectToAction("DisplayStudent", new { Id = id });
}
[HttpGet]
public ActionResult DisplayStudent(int id)
{
StudentResponseViewModel model = FetchTheModelFromSomewhere(id);
return View(model);
}
У каждого метода есть свои плюсы и минусы. Вам решать, какой из них лучше всего подходит для вашего сценария.