我有具有用于被返回到视图滤波结果几个可选参数的索引方法的控制器。
public ActionResult Index(string searchString, string location, string status) {
...
product = repository.GetProducts(string searchString, string location, string status);
return View(product);
}
我想实现像下面的PRG模式,但我不知道如何去做。
[HttpPost]
public ActionResult Index(ViewModel model) {
...
if (ModelState.IsValid) {
product = repository.GetProducts(model);
return RedirectToAction(); // Not sure how to handle the redirect
}
return View(model);
}
我的理解是,你不应该使用这种模式,如果:
- 你并不需要使用这种模式,除非你有实际存储一些数据(我不是)
- 你不会使用这种模式避免了“你确定要重新”从IE消息刷新页面时(有罪)
我应该尝试使用这个模式? 如果是这样,我怎么会去吗?
谢谢!
PRG代表后重定向消息获取 。 这意味着,当你发布一些数据到服务器后面,你应该重定向到一个GET
操作。
我们为什么要这么做?
想象一下,你有表格,你输入客户的注册信息,点击提交它发布到一个HttpPost操作方法。 您从表中读取数据,并将其保存到数据库和你没有做重定向。 相反,你是住在同一页上。 现在,如果你刷新浏览器(只需按F5键),该浏览器将再做类似的形式发布,你的HttpPost行动方法将再次做同样的事情。 即; 这将再次保存相同的表格数据。 这是个问题。 为了避免这个问题,我们使用PRG模式。
在PRG,你点击提交,并在HttpPost
操作方法将节省您的数据(或任何它所要做的),然后做一个重定向到一个Get
请求。 因此,浏览器会发送一个Get
请求采取行动
RedirectToAction
方法返回一个HTTP 302
响应于所述浏览器,这会导致浏览器作出GET请求到指定的操作。
[HttpPost]
public ActionResult SaveCustemer(string name,string age)
{
//Save the customer here
return RedirectToAction("CustomerList");
}
上面的代码将保存数据并重定向到客户列表的操作方法。 所以,你的浏览器的URL将现在http://yourdomain/yourcontroller/CustomerList
。 现在,如果你刷新浏览器。 它不会保存重复的数据。 它只会加载CustomerList页面。
在你的搜索行动方法,你不需要做一个重定向到一个获取动作。 你必须在搜索结果中products
变量。 只是传递到需要的视图来显示结果。 你不需要担心重复的形式发布。 所以,你是好这一点。
[HttpPost]
public ActionResult Index(ViewModel model) {
if (ModelState.IsValid) {
var products = repository.GetProducts(model);
return View(products)
}
return View(model);
}
一个重定向只是一个ActionResult是另一个动作。 所以,如果你有一个动作叫SearchResult所,你就简单的说
return RedirectToAction("SearchResults");
如果这个动作是在另一个控制器...
return RedirectToAction("SearchResults", "ControllerName");
随着参数...
return RedirectToAction("SearchResults", "ControllerName", new { parameterName = model.PropertyName });
更新
它发生,我认为你可能也想送一个复杂的对象到下一个动作,在这种情况下,你只有有限的选项的,TempData的是首选的方法
用你的方法
[HttpPost]
public ActionResult Index(ViewModel model) {
...
if (ModelState.IsValid) {
product = repository.GetProducts(model);
TempData["Product"] = product;
return RedirectToAction("NextAction");
}
return View(model);
}
public ActionResult NextAction() {
var model = new Product();
if(TempData["Product"] != null)
model = (Product)TempData["Product"];
Return View(model);
}