2012-04-20 39 views
0

我指的是Darin在以下的回答post如何在.NET MVC 3中实现正确的HTTP错误处理?

我正在使用MVC3,我想知道这是否仍然是一种处理错误的方法?

在rrror控制器他有如下:

public ActionResult Http404() 
{ 
    Response.StatusCode = 404; 

    return Content("404", "text/plain"); 
} 

从他的代码工作。我希望它显示完整的URL,我会怎么做呢?所以它需要是www.mywebsite.com/Error/Http404而不仅仅是www.mywebsite.com。我将如何做到这一点?我想,如果我有下面的代码,然后它会显示完整的URL,但它仍然只是显示www.mywebsite.com:

public ActionResult Http404() 
{ 
    Response.StatusCode = 404; 

    return View("Http404"); 
} 

我将如何得到这是在全球前设定的值。 asax.cs将显示在此页面上?

我放弃了在web.config中处理我的错误,因为它打开了查询字符串中的aspxerrorpath。

+0

事实是,除非您正在从服务器执行Response.Redirect,否则您无法更改URL。 – VJAI 2012-04-20 13:22:08

+0

这是从global.asax中完成它的唯一方法吗? – 2012-04-23 05:31:34

+0

Yeh!从global.asax处理异常重定向到相应的控制器操作后,但请注意,您的异常将在重定向中丢失。 – VJAI 2012-04-23 11:59:11

回答

0

因此,根据我的理解,您希望将用户重定向到异常的特定错误页面,并且还要从您想要访问异常的错误页面中重定向。

这是我试过的,创建了一个基本控制器并覆盖OnException方法。在OnException方法中,我正在做大部分您在Global.asax.cs中尝试的操作。

最重要的是,在处理异常后,我在ExceptionContextResult属性中设置RedirectAction

同样为了从错误视图中访问Exception我在TempData中存储了异常。从ErrorController我将例外作为HandleErrorInfo实例传递给视图。

这里是完整的代码。

// BaseController 
public class BaseController : Controller 
{ 
    protected override void OnException(ExceptionContext filterContext) 
    { 
    if (!filterContext.ExceptionHandled) 
    { 
     var action = "General"; 

     if (filterContext.Exception is HttpException) 
     { 
     var httpException = filterContext.Exception as HttpException; 

     switch (httpException.GetHttpCode()) 
     { 
      case 404: 
      // page not found 
      action = "Error404"; 
      break; 
      case 500: 
      // server error 
      action = "Error500"; 
      break; 
      default: 
      action = "General"; 
      break; 
     } 
     } 

     filterContext.Result = RedirectToAction(action, "error"); 
     TempData["error"] = new HandleErrorInfo(filterContext.Exception, 
          RouteData.Values["controller"].ToString(), 
          RouteData.Values["action"].ToString()); 
     filterContext.ExceptionHandled = true; 
    } 
    } 
} 

// Error Controller 
public class ErrorController : Controller 
{ 
    public ActionResult Error404() 
    { 
    return View(TempData["error"] as HandleErrorInfo);  
    } 

    // other methods 
} 

// Sample controller derives from BaseController. 
public class HomeController : BaseController 
{ 
    public ActionResult Index() 
    { 
    return View(); 
    } 

    public ActionResult NotFound() 
    { 
    throw new HttpException(404, "Not Found"); 
    } 
} 

// Error404.cshtml 
@model System.Web.Mvc.HandleErrorInfo 
@{ 
    ViewBag.Title = "404 Not Found"; 
} 
<h2>@ViewBag.Title</h2> 

<p> 
    Last Exception: @Model.Exception 
</p> 

UPDATE:一个缺点用这种方法,我们可以处理HTTP异常404,500或什么,如果从控制器的动作仅抛出。