首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET 內嵌程式碼區塊存取基底類別成員陷阱

     編輯:ASP.NET 基礎

現象重現

// 基底頁面
public class BasePage : System.Web.UI.Page
{
    public int HotelID { get { return 1; } }
}

// 衍生頁面
public partial class DerivedPage : BasePage
{
    public new int HotelID { get { return 0; } } // 隱藏基底成員
}

在 .aspx 頁面撰寫 <%= base.HotelID %>,預期輸出 1,實際卻輸出 0。

原因分析

ASP.NET 頁面編譯產生的類別繼承自 DerivedPage,內嵌程式碼區塊 (<% ... %>) 執行時的 this 指向該頁面類別實例。base.HotelID 在編譯時期被解析為 ((BasePage)this).HotelID,但因 DerivedPage 以 new 關鍵字隱藏了 HotelID,且 HotelID 非 virtual,呼叫仍會解析到衍生類別的實作,導致回傳 0。

解決方案

  1. 避免同名隱藏:基底與衍生類別使用不同屬性名稱 (如 BaseHotelID、HotelID)。
  2. 強制轉型呼叫:<%= ((BasePage)this).HotelID %> 可正確取得基底實作值 1。
  3. 改為 virtual/override:基底標記 virtual,衍生 override,則多型運作正常。

建議

盡量避免在 .aspx 內嵌程式碼區塊存取基底成員,改由後端 Code-behind 屬性包裝後再由前端呼叫,維護性更佳。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved