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 3 MVC3自定义错误页给出空白结果_Asp.net Mvc 3_Error Handling - Fatal编程技术网

Asp.net mvc 3 MVC3自定义错误页给出空白结果

Asp.net mvc 3 MVC3自定义错误页给出空白结果,asp.net-mvc-3,error-handling,Asp.net Mvc 3,Error Handling,使用发布的博客和一个主题,我创建了一个控制器,可以处理我所有的错误页面 在我的Global.asax.cs中,我有以下代码: protected void Application_Error() { var exception = Server.GetLastError(); var httpException = exception as HttpException; var routeData = new

使用发布的博客和一个主题,我创建了一个控制器,可以处理我所有的错误页面

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

    }
公共类ErrorController:BaseController
{
/// 
///返回不具有访问权限的默认视图。
/// 
公共行动结果未经授权()
{
BaseModel viewModel=新的BaseModel
{
LoginModel=新LogonModel(),
ProfessionsTopX=GetTopExportions()
};
返回视图(viewModel);
}
公共行动结果一般(例外)
{
返回视图(“异常”,异常);
}
公共行动结果Http404()
{
//这条线有效
//返回内容(“未找到”、“文本/普通”);
//这一行表示空白页
返回视图(“404”,“_布局”);
}
公共行动结果Http403()
{
返回视图(“403”,“_布局”);
}
}
我的Razor视图只包含下面的html片段

@{
    ViewBag.Title = "404";
}

<h2>404</h2>

This is a 404 page!
@{
ViewBag.Title=“404”;
}
404
这是404页!
当我使用返回内容时,我得到一个简单的文本输出,告诉我我正在查看404页面。但是,我希望404页面适合我设计的其余部分,因此我希望使用我自己的视图。然而,一旦我使用返回视图,我就会得到一个空白页。我希望遗漏一些非常明显的东西,但我看不到。

请检查一下。这是在mvc中实现异常处理的最佳方法


我已经实现了相同的异常处理,但我面临一些问题,但您仍然可以参考。

我遇到了相同的问题,最终找到了适合我的解决方案。当我在
errorscoontroller.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
异常被吞没了,我假设是因为它发生在应用程序的错误方法中,并且因为我设置了
Response.tryskipiiscustomerors=true

看到这个错误后,我很快意识到我的问题只是名称不匹配:我的控制器实际上命名为
ErrorController
,没有“s”,而不是
errorscocontroller
。我的问题是我设置了
routeData.Values[“controller”]=“Errors”,这是错误的。将其切换到路由数据值[“控制器”]=“错误”修复了该问题

请注意,您不会立即捕获错误,因为您直接实例化了控制器,并且如果该部分拼写错误,它将不会编译。但是在控制器内部,调用View()将使用我们构造并传递给
RequestContext
对象的
RouteData
实例查找视图。因此,如果控制器名称拼写错误,MVC不知道在哪里查找视图,并且由于跳过了IIS自定义错误,因此它会自动失败


长话短说:检查控制器和视图名称。如果控制器名称正确,但视图的文件名不匹配,我假设会发生类似情况。

昨晚尝试过,但不幸的是没有解决问题(但)欢迎其他建议!同样的事情也发生在我身上,一直到我为代码建模的帖子。同样的事情也发生在我身上。你有没有找到解决这个问题的方法?没有,没有,谢谢你的回复!似乎很合乎逻辑。我们会尽快尝试,并尽快回复您!多么愚蠢!我将名称从Errors改为Error,然后可以调试所有内容。第一次注意到我仍然得到一个白色页面,但在进入/浏览所有内容后,我看到一个异常出现,这是可以理解的。解决了它,一切正常。