MVC3自定义错误页给出空白结果(MVC3 Custom error pages gives bla

2019-09-19 01:21发布

使用博客张贴在这里和一个主题在这里 ,所以我已经创建了一个控制器,它应该处理我所有的错误页面。

在我的Global.asax.cs我有以下的代码:

protected void Application_Error()
        {
            var exception = Server.GetLastError();
            var httpException = exception as HttpException;
            var routeData = new RouteData();

            Response.Clear();
            Server.ClearError();

            routeData.Values["controller"] = "Error";
            routeData.Values["action"] = "General";
            routeData.Values["exception"] = exception;
            Response.StatusCode = 500;

            if (httpException != null)
            {
                Response.StatusCode = httpException.GetHttpCode();
                switch (Response.StatusCode)
                {
                    case 403:
                        routeData.Values["action"] = "Http403";
                        break;
                    case 404:
                        routeData.Values["action"] = "Http404";
                        break;
                }
            }

            // Avoid IIS7 getting in the middle
            Response.TrySkipIisCustomErrors = true;
            IController errorsController = new ErrorController();
            HttpContextWrapper wrapper = new HttpContextWrapper(Context);
            var rc = new RequestContext(wrapper, routeData);
            errorsController.Execute(rc);
        }

我ErrorController看起来是这样的:

public class ErrorController : BaseController
    {
        /// <summary>
        /// Returns a default view for not having access.
        /// </summary>
        public ActionResult Unauthorized()
        {
            BaseModel viewModel = new BaseModel
                                      {
                                          LoginModel = new LogonModel(),
                                          ProfessionsTopX = GetTopXProfessions()
                                      };
            return View(viewModel);
        }

        public ActionResult General(Exception exception)
        {
            return View("Exception", exception);
        }

        public ActionResult Http404()
        {
            //This line works
            //return Content("Not found", "text/plain");

            //This line presents a blank page
            return View("404","_Layout");
        }

        public ActionResult Http403()
        {
            return View("403", "_Layout");
        }

    }

而我的Razor视图只包含一块下面的html;

@{
    ViewBag.Title = "404";
}

<h2>404</h2>

This is a 404 page!

当我使用返回内容我得到一个纯textoutput告诉我,我看404页。 不过,我想404页,以适应我的设计的休息,所以我想用我自己的看法。 但是,只要我使用返回查看我得到一个空白页。 我希望是失去了一些东西很明显,但我没有看到它。

Answer 1:

我有同样的问题,终于发现我工作的解决方案。 突破来了,当我放置在一个断点errorsController.Execute(rc); 行,用“步入”,直到我碰到这个例外传来:

The view 'Detail' or its master was not found or no view engine supports the 
searched locations. The following locations were searched:
~/Views/Errors/Detail.aspx
~/Views/Errors/Detail.ascx
~/Views/Shared/Detail.aspx
~/Views/Shared/Detail.ascx
~/Views/Errors/Detail.cshtml
~/Views/Errors/Detail.vbhtml
~/Views/Shared/Detail.cshtml
~/Views/Shared/Detail.vbhtml

唯一的例外是被吞噬,我想是因为它是Application_Error事件内部发生因为我已成立Response.TrySkipIisCustomErrors = true

看到这个错误后,我很快就意识到我的问题是根本不匹配名称之一:我的控制器实际上是一个名为ErrorController没有的',而不是ErrorsController 。 对我来说,问题是,我已经设置routeData.Values["controller"] = "Errors"; ,这是不对的。 它切换到routeData.Values["controller"] = "Error"; 解决了这一问题。

请注意,你不会赶上错误马上,因为你直接实例化控制器,如果您有部分拼写错了,它不会编译。 但是控制器,调用视图()内将寻找使用视图RouteData我们构建并传递到该实例RequestContext对象。 所以,如果控制器名称的拼写有错,MVC不知道到哪里寻找视图,因为IIS自定义错误被跳过,它静静地失败。

长话短说:检查您的控制器和视图名称。 我认为,如果你有控制器名称正确类似的东西会发生,但视图的文件名不匹配。



Answer 2:

请出来检查这个 。 它是实现MVC中的异常处理一个最好的办法。

我已经实现同样的异常处理,但我面临着一些问题,但你仍然可以参考这个 。



文章来源: MVC3 Custom error pages gives blank result