我有一个带有Index方法的控制器,该方法有几个可选参数,用于过滤返回到视图的结果。
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);
}
我的理解是,如果出现以下情况,则不应使用此模式:
我应该尝试使用这种模式吗?如果是这样,我将如何解决这个问题?
谢谢!
答案 0 :(得分:5)
PRG 代表重定向后 - 获取。这意味着当您向服务器发回一些数据时,您应该重定向到GET
操作。
为什么我们需要这样做?
想象一下,您有一个表单,您可以在其中输入客户注册信息,然后单击提交到HttpPost操作方法的提交位置。您正在从表单中读取数据并将其保存到数据库,而您没有进行重定向。相反,你会留在同一页面上。现在,如果您刷新浏览器(只需按F5按钮)浏览器将再次执行类似的表单发布,您的HttpPost Action方法将再次执行相同的操作。即;它将再次保存相同的表单数据。这是个问题。为了避免这个问题,我们使用PRG模式。
在 PRG 中,您点击“提交”,HttpPost
操作方法将保存您的数据(或任何必须执行的操作),然后重定向到Get
请求。因此,浏览器会向该操作发送Get
请求
RedirectToAction
方法向浏览器返回HTTP 302
响应,这会导致浏览器对指定的操作发出GET请求。
[HttpPost]
public ActionResult SaveCustemer(string name,string age)
{
//Save the customer here
return RedirectToAction("CustomerList");
}
上述代码将保存数据并重定向到Customer List操作方法。因此,您的浏览器网址现在为http://yourdomain/yourcontroller/CustomerList
。现在,如果您刷新浏览器。 IT部门不会保存重复数据。它只会加载CustomerList页面。
在搜索Action方法中,您不需要重定向到Get Action。您在products
变量中包含搜索结果。只需将其传递到所需视图即可显示结果。您不必担心重复的表单发布。所以你很擅长。
[HttpPost]
public ActionResult Index(ViewModel model) {
if (ModelState.IsValid) {
var products = repository.GetProducts(model);
return View(products)
}
return View(model);
}
答案 1 :(得分:2)
重定向只是一个ActionResult,是另一个动作。因此,如果您有一个名为SearchResults的操作,您只需说
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);
}