在MVC

时间:2017-06-27 20:15:54

标签: c# xml asp.net-mvc asp.net-mvc-4

我有一个MVC C#应用程序,我需要在发生错误时向用户显示特定视图。

因此,如果错误是代码= 200,代码= 404,代码= 500或任何其他错误,我只需显示位于~/Views/Shared/Error.cshtml的错误视图,并附带一般消息。

所以我的问题是:在global.asax

中添加它是否足够
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
}

或者我还需要以这种方式修改我的web.config:

<customErrors mode="RemoteOnly">
    <error statusCode="404" redirect="~/Views/Shared/Error.cshtml"/>
    <error statusCode="500" redirect="~/Views/Shared/Error.cshtml"/>
</customErrors>

只有一个选项是必要的,还是我必须添加其中两个?

3 个答案:

答案 0 :(得分:1)

  

所以我的问题是:在global.asax

中添加它是否足够
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
}

否,因为HandleErrorAttribute只会捕获错误代码500(内部服务器错误)。

除了500之外你想要捕捉404(页面未找到),最好的方法是使用httpErrors,因为它们也会捕获不匹配的404 \ n您定义的任何路线。

自定义错误只会捕获与路径匹配的404。例如,来自http://example.com/someNonExistantFile.html的404 将不会被自定义错误捕获(假设不存在与URL匹配的路由)。来自http://example.com/ControllerName/someNonExistentAction的404将被自定义错误捕获。

我在web.config httpErrors部分中设置了system.webserver

<httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="400" subStatusCode="-1" />
  <remove statusCode="403" subStatusCode="-1" />
  <remove statusCode="404" subStatusCode="-1" />
  <remove statusCode="500" subStatusCode="-1" />
  <error statusCode="400" path="/Error/BadRequest" responseMode="ExecuteURL"/>
  <error statusCode="403" path="/Error/NotAuthorized" responseMode="ExecuteURL" />
  <error statusCode="404" path="/Error/NotFound" responseMode="ExecuteURL" />
  <error statusCode="500" path="/Error" responseMode="ExecuteURL" />
</httpErrors>

然后在我的错误控制器中,我相应地设置了http响应代码。这样做可以防止谷歌和其他人将您的错误页面编入索引。

这是我使用的ErrorController:

[AllowAnonymous]
public class ErrorController : Controller
{
    public ActionResult Index()
    {
        Response.StatusCode = 500;
        return View("Error");
    }

    public ViewResult BadRequest()
    {
        Response.StatusCode = 400;
        return View("BadRequest");
    }

    public ViewResult NotFound()
    {
        Response.StatusCode = 404;
        return View("NotFound");
    }

    public ViewResult NotAuthorized()
    {
        Response.StatusCode = 403;
        return View("NotAuthorized");
    }
}

答案 1 :(得分:1)

You can use very simple approach here.

You can use  **Application_Error()** events and write it in **Global.asax** 
file.Its called automatically whenever system generates any type of error

Note : Create "ErrorController" and inside that make one view with name 
"Errors.cshtml"


protected void  Application_Error(object sender, EventArgs e)
{
        if (null != Context && null != Context.AllErrors)
        {
            Exception exception = Server.GetLastError().GetBaseException();

              RouteData routeData = new RouteData();
                routeData.Values.Add("controller", "Error");
                if (exception == null)
                {
                    routeData.Values.Add("action", "Index");
                }
                else
                {
                    routeData.Values.Add("action", "Errors");
                    routeData.Values.Add("exceptionValue", exception);
                }

                Response.TrySkipIisCustomErrors = true;
                IController errorController = new ErrorsController();
                errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
            }

  }

答案 2 :(得分:0)

您可以在基本控件中创建自定义过滤器,然后在每个控制器中应用该过滤器,因此当出现任何错误时,它将捕获通用逻辑并呈现定义的视图/ html。

请看下面的帖子。我已经描述了如何处理服务器以及属性中的客户端错误。

Error handeling in MVC