Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc TempData&;错误重定向_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc TempData&;错误重定向

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() {

我的项目中有一个控制器操作,在某些情况下需要向用户显示错误消息。此操作发生在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操作的视图,因为我不想让它们刷新并导致另一个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页面有什么严重的问题,但也没有什么好的理由。