熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.net MVC自定義錯誤處理頁面

2013-11-13 09:54:44  來源: .NET編程 

  在ASPNET MVC中我們可以使用HandleErrorAttribute特性來具體指定如何處理Action拋出的異常只要某個Action設置了HandleErrorAttribute特性那麼默認的當這個Action拋出了異常時MVC將會顯示Error視圖該視圖位於~/Views/Shared目錄下

  設置HandleError屬性

  可以通過設置下面這些屬性來更改HandleErrorAttribute特性的默認處理:

  ExceptionType指定過濾器處理那種或哪些類型的異常如果沒有指定該屬性過濾器將會處理所有的異常

  View指定發生異常時過濾器要顯示的視圖名稱

  Master指定視圖母版的名稱如果有的話

  Order指定過濾器應用的順序如果一個Action有多個HandleErrorAttribute過濾器

  指定Order屬性

  如果某個Action設置了多個HandleErrorAttributeOrder屬性可以用來確定使用哪個過濾器其值可以設置為從(最高優先級)到任何正整數之間的整數來標識其優先級值越大優先級別越低Order屬性遵循以下規則:

  應用到Controller上的過濾器將會自動應用到該Controller的所有Action上

  如果Controller和Action都應用了HandleErrorAttribute那麼只要Order屬性值相同將會先執行Controller上的過濾器而後才會執行Action上的過濾器

  對於相同Order屬性的過濾器其執行先後次序不定

  如果沒有指定Order屬性則默認為這意味著該過濾器將比其他的過濾器優先執行除非其他過濾器指定了Order為

  如果有多個過濾器可適用那麼第一個可以處理該異常的過濾器會被首先調用然後針對該異常的處理將會終結

  在View中獲取異常信息

  ASPNET MVC框架將異常信息存儲在ViewDataDictionary中來傳遞給Error視圖該ViewDataDictionary的Model屬性即是ExceptionContext類的一個實例這個ViewData有下面幾個鍵:

  ActionName:目標Action方法的名稱

  ControllerName:目標Controller的名稱

  Exception:異常對象

  啟用自定義錯誤處理

  下面我們來開啟用於HandleErrorAttribute過濾器的自定義錯誤處理打開程序的nfig文件在systemweb節中加入一個customErrors元素如下所示

  <systemweb>

  <customErrors mode=On defaultRedirect=Error />

  </systemweb>

  處理Error視圖中的錯誤

  有時候在Error視圖中也會發生錯誤這時ASPNET將會顯示其默認的錯誤頁面(黃底紅字)為了避免這種情況的出現我們在nfig文件的customErrors節中來自定義錯誤頁面如下:

  <systemweb>

  <customErrors mode=On defaultRedirect=>

  <error statusCode= redirect=/ />

  </customErrors>

  </systemweb>

  示例程序

  下面的示例說明了如何對Controller和Action應用HandleErrorAttribute特性來自定義異常處理

  示例中HomeController有一個名為ThrowException的Action方法在該Action中將會拋出一個ApplicationException類型的錯誤這個Action應用了HandleErrorAttribute但是沒有設置任何參數當該Action執行時將會拋出一個異常顯示默認的Error視圖

  而ThrowNotImplemented方法則應用了設有兩個參數的HandleErrorAttributeView參數指定了自定義的Error視圖名稱:CustomErrorViewExceptionType參數指定了該過濾器僅處理ThrowNotImplemented類型的異常

  Controller的HandleErrorAttribute則設置了Order參數為意味著該過濾器只會被在Index或About方法產生異常時執行

  同時示例給出了視圖CustomErrorView和CustomErrorMaster的內容

  視圖CustomErrorView顯示異常的信息比如拋出異常的Controller和Action的名稱異常的內容以及堆棧跟蹤信息

  視圖Index上有兩個鏈接分別指向了ThrowException和ThrowNotImplemented兩個Action

  HomeController類

  [HandleError(Order = )]

  public class HomeController : Controller

  {

  public ActionResult Index()

  {

  ViewData[Message] = Welcome to ASPNET MVC!;

  return View();

  }

  public ActionResult About()

  {

  return View();

  }

  [HandleError]

  public ActionResult ThrowException()

  {

  throw new ApplicationException();

  }

  [HandleError(View = CustomErrorView ExceptionType = typeof(NotImplementedException))]

  public ActionResult ThrowNotImplemented()

  {

  throw new NotImplementedException();

  }

  }

  視圖 CustomErrorView

  <asp:Content ID=Content ContentPlaceHolderID=TitleContent runat=server>

  CustomErrorView

  </asp:Content>

  <asp:Content ID=Content ContentPlaceHolderID=MainContent runat=server>

  <h>CustomErrorView</h>

  <p>

  Controller: <%=((HandleErrorInfo)ViewDataModel)ControllerName %>

  </p>

  <p>

  Action: <%=((HandleErrorInfo)ViewDataModel)ActionName %>

  </p>

  <p>

  Message: <%=((HandleErrorInfo)ViewDataModel)ExceptionMessage %>

  </p>

  <p>

  Stack Trace: <%=((HandleErrorInfo)ViewDataModel)ExceptionStackTrace %>

  </p>

  </asp:Content>

  視圖 Index

  <asp:Content ID=indexTitle ContentPlaceHolderID=TitleContent runat=server>

  Home Page

  </asp:Content>

  <asp:Content ID=indexContent ContentPlaceHolderID=MainContent runat=server>

  <h><%= HtmlEncode(ViewData[Message]) %></h>

  <%= HtmlActionLink(Throw An Exception ThrowException)%> (Default Error Page)

  <br /><br />

  <%= HtmlActionLink(Throw Not Implemented Exception ThrowNotImplemented)%> (Custom Error Page)

  </asp:Content>

  母版頁 CustomErrorMaster

  <%@ Master Language=C# Inherits=SystemWebMvcViewMasterPage %>

  <!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN transitionaldtd>

  <html xmlns= >

  <head runat=server>

  <title><asp:ContentPlaceHolder ID=TitleContent runat=server /></title>

  <link stylesheet type=text/css />

  <style type=text/css>

  bodyerror

  {

  backgroundcolor: Maroon;

  color: #;

  }

  </style>

  </head>

  <body class=error>

  <div class=page>

  <div id=header>

  <div id=title>

  <h>A Custom Error Occurred</h>

  </div>

  <div id=logindisplay>

  <% HtmlRenderPartial(LogOnUserControl); %>

  </div>

  <div id=menucontainer>

  <ul id=menu>

  <li><%= HtmlActionLink(Home Index Home)%></li>

  <li><%= HtmlActionLink(About About Home)%></li>

  </ul>

  </div>

  </div>

  <div id=main>

  <asp:ContentPlaceHolder ID=MainContent runat=server />

  <div id=footer>

  </div>

  </div>

  </div>

  </body>

  </html>


From:http://tw.wingwit.com/Article/program/net/201311/11950.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.