Asp.net mvc TempData&;错误重定向
我的项目中有一个控制器操作,在某些情况下需要向用户显示错误消息。此操作发生在POST中:Asp.net mvc TempData&;错误重定向,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,我的项目中有一个控制器操作,在某些情况下需要向用户显示错误消息。此操作发生在POST中: [HttpPost] public ActionResult DoSomeAction() { if( someCondition ) return RedirectToAction("SomeActionError"); return RedirectToAction("Index"); } public ActionResult SomeActionError() {
[HttpPost]
public ActionResult DoSomeAction() {
if( someCondition )
return RedirectToAction("SomeActionError");
return RedirectToAction("Index");
}
public ActionResult SomeActionError() {
return View();
}
目前,我已将其设置为重定向到错误控制器操作。我并不喜欢这种方法,因为他们在URL中看到/SomeActionError
,这也意味着用户可以直接导航到此URL
在TempData中放置一些标志并重定向到另一个检查TempData错误标志的控制器是否是一种错误的设计/方法
例如:
[HttpPost]
public ActionResult DoSomeAction() {
if( someCondition ) {
TempData["DoSomeActionError"] = true;
}
return RedirectToAction("Index");
}
public ActionResult Index() {
// check for error
if( TempData["DoSomeActionError"] ) {
return View("SomeActionError");
}
}
这是个坏主意吗?是否有其他类似的方法(不允许用户直接导航到错误操作)?我不想返回POST操作的视图,因为我不想让它们刷新并导致另一个POST。在mvc中使用tempdata不是一个好方法。 如果我是你,我会做以下事情:
[HttpPost]
public ActionResult DoSomeAction() {
if( someCondition ) {
return RedirectToAction("Index", new{error=true}
}
return RedirectToAction("Index");
}
public ActionResult Index(bool? error) {
// check for error
if(error?? false ) {
return View("SomeActionError");
}
}
TempData本身并不是一个坏概念。TempData用于将信息传输给读取该信息的某个消费者,该信息在读取后应消失 你使用TempData的方式很奇怪。针对您的需求的一个更优雅的实现(您应该显示一条错误消息)是实现一个与rails flash概念等效的实现,并且不重定向到错误页面,而是在索引视图中显示一条错误消息。类似于一条红色横幅,上面写着“记录无法保存”
显示了一个不错的flash实现,包括查看内容(不是接受的答案,而是@jim的答案)虽然我不同意TempData总是不好(我发现它非常适合状态消息,我绝对不希望通过url传递,例如“record saved”,但我认为在您的情况下,可能有更好的选择 首先,你不希望错误页面被访问-我可以问一下为什么吗?
在发生错误时执行重定向只是再次重定向有点奇怪。我会抛出异常并通过错误视图处理该异常。MVC会自动将[HandleError]属性添加为全局筛选器,因此抛出异常(必要时为自定义类型)并在错误页面中按您认为合适的方式处理它,因为您可以在那里访问异常详细信息,并且不需要重定向。一般使用TempData还是在这种情况下使用它?不太喜欢向我的控制器操作添加新参数。这似乎是一种更糟糕的方法。我可以在查询字符串中传递该值,并导致错误要显示的r页。我没有再次重定向?这不是异常错误,更像是违反了业务规则。我在索引页上有一个操作,该操作将发布到DoSomeAction方法。如果现有的业务规则确定由于某种原因无法执行该操作,我希望显示错误页。因此我最初重定向到这是一个错误操作,但我想知道是否可以使用TempData并重定向回Index操作(调用的来源)。我的操作基本上是一种工作流操作-给我下一个可以工作的项。如果没有剩余的工作项,那么我想显示“没有更多的工作项了”并不是说他们直接导航到/NoWorkItemsAvailable页面有什么严重的问题,但也没有什么好的理由。