記一次mvc頁面打不開的解決歷程

癥狀:本地開發(fā)沒有問題,頁面能正常打開,但是一發(fā)布,就報錯.


image.png

根據(jù)提示,在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>
        /// 在異常發(fā)生時調用
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnException(ExceptionContext filterContext)
        {
            // 判斷是否已經(jīng)處理過異常
            if (!filterContext.ExceptionHandled)
            {
                // 獲取出現(xiàn)異常的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 = "服務器發(fā)生錯誤:" + 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;
                }
                // 設置已經(jīng)處理過異常
                filterContext.ExceptionHandled = true;
            }
            //base.OnException(filterContext);
        }
    }
}

重點解釋一下
"filterContext.ExceptionHandled = true;"這句是告訴MVC 框架異常已經(jīng)被處理過了,它就不會再進行默認(顯示出報錯的行號)的處理;
//base.OnException(filterContext);當filterContext.ExceptionHandled = =false的時候,讓MVC框架進行默認處理的代碼
所以,這里的邏輯不再符合當前項目的業(yè)務了.經(jīng)過改造后變成了

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>
        /// 在異常發(fā)生時調用
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnException(ExceptionContext filterContext)
        {
            // 判斷是否已經(jīng)處理過異常
            if (!filterContext.ExceptionHandled)
            {
                // 獲取出現(xiàn)異常的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())
                {
                    // 在異步請求中設置已經(jīng)處理過異常
                    filterContext.ExceptionHandled = true;

                    BaseResultModel error = new BaseResultModel();
                    error.Data = info;
                    error.Msg = "服務器發(fā)生錯誤:" + 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請求打開頁面時,繼續(xù)使用mvc自帶的錯誤提示頁
                    base.OnException(filterContext);

                }
                
            }
            
        }
    }
}

編譯后,再發(fā)布一次,刷新


image.png

終于看到了具體的行號
提示"include"文件夾中沒有"loading.cshtml"文件,去服務器上看一下,還真沒有.但是開發(fā)的機器上是有的,為什么在發(fā)布了之后,就沒有了呢?過了一會兒,才反應過來.原來它沒有位于Views文件夾中,那就轉移過來試試,為了保險起見,新建了一個IncludeController,加了一個Action "loading",才添加的視圖.
再編譯,發(fā)布一次,成功了.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容