TempData&重定向错误

时间:2011-11-03 15:07:46

标签: asp.net-mvc asp.net-mvc-3

我的项目中有一个控制器操作,在某些情况下需要向用户显示错误消息。此操作发生在POST:

[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操作上返回View,因为我不希望它们刷新并导致另一个POST。

3 个答案:

答案 0 :(得分:1)

在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");
    }
}

答案 1 :(得分:1)

TempData本身并不是一个坏主意。 TempData用于将信息传输给读取该信息的消费者,信息在读取后就会消失。

你使用TempData的方式很奇怪。针对您的需求的更优雅的实现(您应该显示错误消息)是实现rails flash概念的等效实现,并且不会重定向到错误页面,但会在索引视图中显示错误消息。像红色横幅上写着“记录无法保存”的东西。

This question显示了一个很好的flash实现,包括视图内容(不是接受的答案,但@jim的答案)

答案 2 :(得分:0)

虽然我不同意TempData总是不好(我发现它非常适合状态消息我绝对不想传递给网址,例如“保存记录”,我认为在你的情况下可能有更好的选择。

首先,您不希望错误页面可访问 - 请问为什么? 仅在重新定向错误时进行重定向有点奇怪。我会抛出异常并通过错误视图处理该异常。 MVC自动将 [HandleError] 属性添加为全局过滤器,因此抛出异常(必要时为自定义类型)并在您认为合适的错误页面中处理它,因为您可以在那里访问异常详细信息它不需要重定向。