美文网首页
记一次mvc页面打不开的解决历程

记一次mvc页面打不开的解决历程

作者: 波波有理的菠菜 | 来源:发表于2020-09-10 15:46 被阅读0次

症状:本地开发没有问题,页面能正常打开,但是一发布,就报错.


image.png

根据提示,在Web.config中加了<customErrors mode="Off"/>
如图:


image.png

再刷新下页面:


image.png

至少错误提示变化了
查看自己项目里面确实少了文件夹"Shared",就新建了一个空的MVC项目,把Views文件夹里的"Shared"文件夹连同文件一次copy了过来,
再刷新


image.png
有点失望呢,这么简单的提示吗?
于是打开Error.cshtml看看里面的代码
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="viewport" content="width=device-width" />
    <title>错误</title>
</head>
<body>
    <hgroup>
        <h1>错误。</h1>
        <h2>处理你的请求时出错。</h2>
    </hgroup>
</body>
</html>

就只有13行,以前没有打开过,今天才注意到.但是为什么不是下面这种错误?能告诉我是哪一行的那种提示.


image.png

这是我故意写的异常.但是为什么demo项目没有简单得显示"处理你的请求时出错。"?这里有猫腻!

突然想到 App_Start/FilterConfig.cs里面被我重写过
于是去看下demo项目里的代码.默认是

using System.Web;
using System.Web.Mvc;

namespace WebApplication1
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }
    }
}

简直不能更简单.
就是这个"HandleErrorAttribute"显示出了具体的出错行号.
看我项目里的这个文件

using LS365.ModelBase;
using System.Web;
using System.Web.Mvc;

namespace LS365.Admin
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            // filters.Add(new HandleErrorAttribute());
            filters.Add(new ExceptionFilterAttribute());
        }
    }

    public class ExceptionFilterAttribute : HandleErrorAttribute
    {
        /// <summary>
        /// 在异常发生时调用
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnException(ExceptionContext filterContext)
        {
            // 判断是否已经处理过异常
            if (!filterContext.ExceptionHandled)
            {
                // 获取出现异常的controller和action名称,用于记录
                string strControllerName = filterContext.RouteData.Values["controller"].ToString();
                string strActionName = filterContext.RouteData.Values["action"].ToString();
                // 定义一个HandleErrorInfo,用于Error视图展示异常信息
                HandleErrorInfo info = new HandleErrorInfo(filterContext.Exception, strControllerName, strActionName);
                if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
                {
                    BaseResultModel error = new BaseResultModel();
                    error.Data = info;
                    error.Msg = "服务器发生错误:" + info.Exception.Message;
                    filterContext.Result = new JsonNetResult() { Data= error };
                }
                else
                {
                    ViewResult result = new ViewResult
                    {
                        ViewName = this.View,
                        // 定义ViewData,泛型
                        ViewData = new ViewDataDictionary<HandleErrorInfo>(info)
                    };

                    // 设置操作结果
                    filterContext.Result = result;
                }
                // 设置已经处理过异常
                filterContext.ExceptionHandled = true;
            }
            //base.OnException(filterContext);
        }
    }
}

重点解释一下
"filterContext.ExceptionHandled = true;"这句是告诉MVC 框架异常已经被处理过了,它就不会再进行默认(显示出报错的行号)的处理;
//base.OnException(filterContext);当filterContext.ExceptionHandled = =false的时候,让MVC框架进行默认处理的代码
所以,这里的逻辑不再符合当前项目的业务了.经过改造后变成了

using LS365.ModelBase;
using System.Web;
using System.Web.Mvc;

namespace LS365.Admin
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            // filters.Add(new HandleErrorAttribute());
            filters.Add(new ExceptionFilterAttribute());
        }
    }

    public class ExceptionFilterAttribute : HandleErrorAttribute
    {
        /// <summary>
        /// 在异常发生时调用
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnException(ExceptionContext filterContext)
        {
            // 判断是否已经处理过异常
            if (!filterContext.ExceptionHandled)
            {
                // 获取出现异常的controller和action名称,用于记录
                string strControllerName = filterContext.RouteData.Values["controller"].ToString();
                string strActionName = filterContext.RouteData.Values["action"].ToString();
                // 定义一个HandleErrorInfo,用于Error视图展示异常信息
                HandleErrorInfo info = new HandleErrorInfo(filterContext.Exception, strControllerName, strActionName);
               

                if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
                {
                    // 在异步请求中设置已经处理过异常
                    filterContext.ExceptionHandled = true;

                    BaseResultModel error = new BaseResultModel();
                    error.Data = info;
                    error.Msg = "服务器发生错误:" + info.Exception.Message;
                    filterContext.Result = new JsonNetResult() { Data= error };
                }
                else
                {
                    ViewResult result = new ViewResult
                    {
                        ViewName = this.View,
                        // 定义ViewData,泛型
                        ViewData = new ViewDataDictionary<HandleErrorInfo>(info)
                    };

                    // 设置操作结果
                    filterContext.Result = result;
                    //get请求打开页面时,继续使用mvc自带的错误提示页
                    base.OnException(filterContext);

                }
                
            }
            
        }
    }
}

编译后,再发布一次,刷新


image.png

终于看到了具体的行号
提示"include"文件夹中没有"loading.cshtml"文件,去服务器上看一下,还真没有.但是开发的机器上是有的,为什么在发布了之后,就没有了呢?过了一会儿,才反应过来.原来它没有位于Views文件夹中,那就转移过来试试,为了保险起见,新建了一个IncludeController,加了一个Action "loading",才添加的视图.
再编译,发布一次,成功了.

相关文章

  • 记一次mvc页面打不开的解决历程

    症状:本地开发没有问题,页面能正常打开,但是一发布,就报错. 根据提示,在Web.config中加了

  • 浅析 MVC

    MVC是什么 MVC——用于解决页面代码过于重复的一个的设计模式(优化页面代码结构)。首先:MVC没有严格的定义。...

  • HtmlTestRunner1.1 解决页面的view打不开

    问题:页面的view打不开 解决方法:由于jquery加载不成功,导致了页面的view打不开,只要把地址换成国内能...

  • CodeIgniter框架基础入门

    本文通过一个编写简约(lou)的个人页面网站实例,来带大家入门CI 历程 最初接触的PHP MVC框架是Think...

  • 因为喜欢

    来一场旅游,记一次历程…

  • DTSweb页面打不开

    1.查看有无mongo进程,和8100进程。 4.若可以启动,则重启服务器,后看访问是否正常。 ^^^^^^^^或...

  • 简书社区 爱你很难

    可怜的简书社区,想说爱你不容易!尤其最近,垃圾广告每次都在把持着页面,第一次遇见那些垃圾广告,由于打不开页面,险些...

  • Angular中的MVC模式

    MVC模式概述 MVC简介 使用Angular中MVC的优势和缺点 提升服务器性能 减少项目开发时间 页面渲染缓慢...

  • 简书又抽风了

    半个小时前打开提示服务器错误,刚才打开看似正常了,想要关注人却打不开对方的页面,其他提醒页面也打不开,都是提示什么...

  • MVC(页面跳转)

    产品列表页面 "加入购物车" "查看详情" 产品详情页面 "返回列表" "加入购物车" 购物车页面 "继续购物"

网友评论

      本文标题:记一次mvc页面打不开的解决历程

      本文链接:https://www.haomeiwen.com/subject/zgkpektx.html