溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在.net中自定義錯誤頁面

發(fā)布時間:2021-05-14 17:18:17 來源:億速云 閱讀:91 作者:Leah 欄目:開發(fā)技術

本篇文章給大家分享的是有關如何在.net中自定義錯誤頁面,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

針對ajax請求或者接口請求,這樣返回一個重定向頁面,用戶體驗顯然不是太友好,針對這個問題,下面簡單總結一下我自己的想法和解決方案,當然不一定科學和合理,所以也希望有大牛多多指點。

解決方案一:

從物理結構上分割,將web項目嚴格分割成兩個項目(當然可根據(jù)需要繼續(xù)細分):網(wǎng)站(只有網(wǎng)站頁面資源等內(nèi)容)、接口(包括網(wǎng)站的所有數(shù)據(jù)邏輯處理,頁面的數(shù)據(jù)請求交互都是直接同接口交互(js技術)),只是網(wǎng)站項目按照上一篇博文方式設置自定義錯誤頁面方式,這樣是能夠解決問題,項目也會更加的清晰,也有很多公司的項目就是按照這種方式(尤其是webApp),但是在實際項目中,很多項目是沒有達到這種嚴格區(qū)分的,所以下面的解決方案二,將介紹一個更通用的方式

解決方法二:

解決思路是:將上一篇博文.net自定義錯誤頁面實現(xiàn) 與 上上一篇博文 .net捕捉全局未處理異常的3種方式 結合使用,并在實際開發(fā)中嚴格約定(出了url地址請求以外的其他請求都通過post請求實現(xiàn)交互),在撲捉到異常時,如果是post請求,處理異常,并清除異常。具體以步驟如下:

第一步:定義一個請求處理結果數(shù)據(jù)MODEL,代碼如下:

/// <summary>
 /// 請求結果MRequestResult
 /// </summary>
 public class MRequestResult
 {
 /// <summary>
 /// 請求結果編碼(是一個枚舉值)
 /// </summary>
 private RequestResultCodeEnum requestResultCode;

 /// <summary>
 /// 處理結果具體的返回值
 /// </summary>
 private object resultValue;

 /// <summary>
 /// 請求結果編碼(是一個枚舉值)
 /// </summary>
 public RequestResultCodeEnum RequestResultCode
 {
  get
  {
  return this.requestResultCode;
  }

  set
  {
  this.requestResultCode = value;
  }
 }

 /// <summary>
 /// 處理結果具體的返回值
 /// </summary>
 public object ResultValue
 {
  get
  {
  return this.resultValue;
  }

  set
  {
  this.resultValue = value;
  }
 }
 }


 /// <summary>
 /// 請求結果編碼枚舉值()
 /// </summary>
 public enum RequestResultCodeEnum
 {
 /// <summary>
 /// 請求成功
 /// </summary>
 Success = 1,

 /// <summary>
 /// 請求失敗
 /// </summary>
 Fail = -1,
 }

第二步:按照 上一篇博文: .net自定義錯誤頁面實現(xiàn)的步驟,配置好自定義錯誤頁面相關配置操作

第三步:按照 上上一篇博文:.net捕捉全局未處理異常的3種方式 的步驟實現(xiàn)全局異常為處理相關操作設置

第四步:在撲捉全局未處理的異常中,添加上針對post請求的異常處理過濾(直接輸入封裝后的),具體代碼如下:

/// <summary>
 /// 異常處理
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 public void context_Error(object sender, EventArgs e)
 {
  //此處處理異常
  HttpContext ctx = HttpContext.Current;
  HttpResponse response = ctx.Response;
  HttpRequest request = ctx.Request;

  //獲取到HttpUnhandledException異常,這個異常包含一個實際出現(xiàn)的異常
  Exception ex = ctx.Server.GetLastError();
  //實際發(fā)生的異常
  Exception iex = ex.InnerException;

  //// 異常日志落地
  //// 異常日志落地包括:記錄異常文本文件日志、或者記錄異常日志數(shù)據(jù)庫等等(根據(jù)實際項目需要做記錄)

  //// 獲取請求方法
  string httpMethod = request.HttpMethod;
  //// 如果是POST請求,那么是以下請求之一
  //// ajax接口請求
  //// form表單提交
  //// 這種情況的異常,不用跳轉至自已的異常錯誤頁面,直接返回對應系統(tǒng)異常
  if (httpMethod.ToUpper() == "POST")
  {
  //// 構建返回對象值
  MRequestResult requestResultM = new MRequestResult();
  requestResultM.RequestResultCode = RequestResultCodeEnum.Fail;
  requestResultM.ResultValue = "系統(tǒng)異常,請聯(lián)系管理員!";

  response.Write(JsonConvert.SerializeObject(requestResultM, Formatting.Indented));
  ctx.Server.ClearError();//處理完及時清理異常
  }
 }

代碼實例:

ajax請求方法及其邏輯處理實例代碼:

$(function () {
 $.ajax({
  async: true,
  type: "post",
  url: "../ActionTestResult/ContentResultTest",
  data: "name=xu",
  success: function (resultValue) {

  if (resultValue) {
   //// 解析處理結果
   var resultObj = $.parseJSON(resultValue);

   //// 當RequestResultCode==1 說明該請求成功
   ////(備注:并不代表處理成功,具體是否處理成功需要通過ResultValue的值根據(jù)接口約定解析做相應的邏輯處理)
   if (resultObj["RequestResultCode"] == 1) {
   //// 自定義請求成功邏輯處理
   //// 通過解析具體的ResultValue的值做相應的邏輯處理.....
   if (resultObj["ResultValue"]) {
    var doResult = resultObj["ResultValue"].split('^');
    if (doResult && doResult.length > 1) {
    if (doResult[0] == 1) {
     //// 說明處理成功,做相應的邏輯處理
     alert("處理成功!");
    } else {
     //// 處理失敗
     alert(doResult[1]);
    }

    } else {
    alert("操作失??!");
    }

   } else {
    alert("未知結果");
   }

   } else {
   //// 說明請求異常
   //// 自定義邏輯處理
   alert(resultObj["ResultValue"]);
   }
  } else {
   //// 自定義邏輯處理
   alert("操作失敗!");
  }

  console.log(resultValue);
  },
  error: function (data) {
  //// 自定義邏輯處理
  alert("系統(tǒng)異常,請聯(lián)系管理員。電話:8888888");
  console.log(data);
  }
 });
 });

ajax對應的后臺請求接受實例代碼:

/// <summary>
 /// 測試
 /// </summary>
 /// <returns></returns>
 public ContentResult ContentResultTest(string name)
 {
  //// 構建請求處理結果Model
  MRequestResult requestResultM = new MRequestResult() { RequestResultCode = RequestResultCodeEnum.Success };

  //// 業(yè)務處理結果
  string doResult = string.Empty;

  //// 本次自作簡單的參數(shù)非空判斷,只一個示例
  //// 處理結果本例中也只是通過^鏈接表示,在實際處理過程中,可以將結果通過一個Json字符串
  if (string.IsNullOrEmpty(name))
  {
  doResult = "-1^操作失敗:名稱不能為空!";
  }
  else
  {
  ///// 其他自定義業(yè)務邏輯處理,此處省略.....
  doResult = "1^操作成功";
  }

  requestResultM.ResultValue = doResult;
  //// 返回結果
  return Content(JsonConvert.SerializeObject(requestResultM, Formatting.Indented));
 }

ASP.NET 是什么

ASP.NET 是開源,跨平臺,高性能,輕量級的 Web 應用構建框架,常用于通過 HTML、CSS、JavaScript 以及服務器腳本來構建網(wǎng)頁和網(wǎng)站。

以上就是如何在.net中自定義錯誤頁面,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI