【发布时间】:2011-06-06 06:48:37
【问题描述】:
我有以下两种操作方法(为提问而简化):
[HttpGet]
public ActionResult Create(string uniqueUri)
{
// get some stuff based on uniqueuri, set in ViewData.
return View();
}
[HttpPost]
public ActionResult Create(Review review)
{
// validate review
if (validatedOk)
{
return RedirectToAction("Details", new { postId = review.PostId});
}
else
{
ModelState.AddModelError("ReviewErrors", "some error occured");
return RedirectToAction("Create", new { uniqueUri = Request.RequestContext.RouteData.Values["uniqueUri"]});
}
}
所以,如果验证通过,我会重定向到另一个页面(确认)。
如果发生错误,我需要显示与错误相同的页面。
如果我执行return View(),则会显示错误,但如果我执行return RedirectToAction(如上),则会丢失模型错误。
我对这个问题并不感到惊讶,只是想知道你们如何处理这个问题?
我当然可以只返回相同的视图而不是重定向,但我在填充视图数据的“创建”方法中有逻辑,我必须复制它。
有什么建议吗?
【问题讨论】:
-
我通过不对验证错误使用 Post-Redirect-Get 模式来解决这个问题。我只是使用视图()。这样做是完全有效的,而不是跳过一堆箍 - 并重定向您的浏览器历史记录。
-
除了@JimmyBogard 所说的,提取出填充ViewData 的
Create方法中的逻辑,并在CreateGET 方法和失败的验证分支中调用它CreatePOST 方法。 -
同意,避免问题是解决问题的一种方法。我有一些逻辑可以在我的
Create视图中填充内容,我只是把它放在我在GET和失败POST中调用的一些方法populateStuff中。 -
@JimmyBogard 我不同意,如果您发布到操作然后返回视图,您会遇到这样的问题:如果用户点击刷新,他们会收到关于想要再次启动该帖子的警告。
标签: asp.net-mvc error-handling modelstate redirecttoaction http-redirect