Передача переменной из метода [HttpPost] в метод [HttpGet] - PullRequest
4 голосов
/ 14 июля 2011

Я перенаправляю представление из метода [HttpPost] в метод [HttpGet]. Я заставил это работать, но хочу знать, является ли это лучшим способом сделать это.

Вот мой код:

[HttpPost] 
public ActionResult SubmitStudent()
{ 
StudentViewModel model = TempData["model"] as StudentResponseViewModel; 

TempData["id"] = model.Id; 
TempData["name"] = model.Name; 

return RedirectToAction("DisplayStudent"); 
}

[HttpGet] 
public ActionResult DisplayStudent() 
{ 
ViewData["id"] = TempData["id"]; 
ViewData["name"] = TempData["name"]; 

return View(); 
}

Просмотр:

<%@ Page 
Language="C#"
Inherits="System.Web.Mvc.ViewPage"
 %> 
<html>
 <head runat="server"> 
<title>DisplayStudent</title> 
</head> 
<body> 
<div> 
<%= ViewData["id"]%> <br /> 
<%= ViewData["name"]%> 
</div> 
</body> 
</html>

Ответы [ 4 ]

8 голосов
/ 14 июля 2011

В ASP.NET MVC в основном есть 3 метода для реализации шаблона PRG .

  • TempData

Использование 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); 
}

У каждого метода есть свои плюсы и минусы. Вам решать, какой из них лучше всего подходит для вашего сценария.

2 голосов
/ 14 июля 2011

Если вы вставляете эти данные в базу данных, вы должны перенаправить их на действие контроллера, которое содержит эти данные в маршруте:

/Students/View/1

Затем вы можете написать код в контроллере для получения данных.назад из базы данных для отображения:

public ActionResult View(int id) {
    // retrieve from the database
    // create your view model
    return View(model);
}
0 голосов
/ 14 июля 2011

Это классический Post-Redirect-Get шаблон (PRG), и он выглядит хорошо, но я бы добавил один бит кода.В методе DisplayStudent проверьте, не равны ли ваши переменные TempData значения NULL, в противном случае выполните перенаправление на какое-либо действие индекса по умолчанию.Это в случае, если пользователь нажимает клавишу F5, чтобы обновить страницу.

public ActionResult DisplayStudent() 
{ 
    if(TempData["model"] == null)
    {
        return RedirectToAction("Index");
    }

    var model = (StudentResponseViewModel)TempData["model"];
    return View(model); 
}

public ViewResult Index()
{
    IEnumerable<StudentResponseViewModel> students = GetAllStudents();
    return View(students);
}
0 голосов
/ 14 июля 2011

Одно из переопределений RedirectToAction() выглядит так:

RedirectToAction(string actionName, object routeValues)

Вы можете использовать это как:

[HttpPost] 
public ActionResult SubmitStudent()
{ 
StudentViewModel model = TempData["model"] as StudentResponseViewModel; 

return RedirectToAction("DisplayStudent", new {id = model.ID, name = model.Name}); 
}

[HttpGet] 
public ActionResult DisplayStudent(string id, string name) 
{ 
ViewData["id"] = TempData["id"]; 
ViewData["name"] = TempData["name"]; 

return View(); 
}

Надеюсь, что работает.

...