沒有名為 'title' 的公用屬性

這是一個令人摸不著頭緒的錯誤。我有幾個持續開發的網頁, 由於裡面有部份重複的功能, 所以我另外寫了一個繼承 Web.UI.Page 的類別, 把前述幾個常用的功能寫在裡面, 然後再讓那些網頁來繼承這個類別。如下範例...

這是一個令人摸不著頭緒的錯誤。我有幾個持續開發的網頁, 由於裡面有部份重複的功能, 所以我另外寫了一個繼承 Web.UI.Page 的類別, 把前述幾個常用的功能寫在裡面, 然後再讓那些網頁來繼承這個類別。如下範例:

public partial class Support_Customer : Johnny.pageBase 
{...}

在開發期間完全正常, 但當我發佈到 IIS 上後, 奇怪的錯誤發生了:

剖析屬性 'title' 時發生錯誤: 型別 'Support_Customer' 沒有名為 'title' 的公用屬性

在 @Page 鈙述中不能包含 title 屬性? 的確, 我如果把 Title="..." 這幾個字拿掉, 這個錯誤就不會出現。問題是, 同一個程式在 ASP.NET 程式開發伺服器不會有問題, 在 VS 裡也沒問題, 唯獨會在 IIS 上出現錯誤。我記得我以前也都這麼做的, 但怎麼不記得有看過這種錯誤? 還是因為我已經太久沒寫網頁了?

不管怎樣, 程式能跑才是要務, 追根竭底這種事就等有空再說了。

然而, 如果把 Title 述句拿掉, 網頁不就沒有標題了嗎?

經過百般思索, 我慢慢回想起以前似乎對付過類似的問題, 只是詳細的步驟已經遺忘了。還好, 只要知道問題出在哪裡, 事情就好辦了。這種問題只會出現在你寫了一個繼承 System.Web.UI.Page 的類別去讓網頁繼承的時候。如果你偏偏在建立網頁時從 VS IDE 選擇了主版頁面, 然後又加上了網頁標題, 才會跳出這種錯誤。

釐清問題來源之後, 解法就相對簡單了。你必須修改你的基底類別, 使得這個基底類別在 Page_PreInit 時主動選擇套用 Master Page, 寫法如下:

namespace Johnny
{
    public class pageBase : System.Web.UI.Page
    {
        public pageBase()
        {
            base.PreInit += new EventHandler(preInit);
        }

        private void preInit(object sender, EventArgs e)
        {
            base.MasterPageFile = "~/MasterPage/Default.master";
        }
   }
}

在上列程式中, 我們在這個基底類別的 constructor 中手動加上了自己的 PreInit 事件處理函式, 並且在這裡指定 Master Page。接著, 你就可以在任何網頁中讓它繼承這個基底類別了: 

public partial class Support_Customer : Johnny.pageBase
{ ... }

經過這麼改造之後, 我們在建立網頁的時候, 不用修改任何東西, 已經不會出現任何錯誤。不過我們自己心裡要有個底, 那就是在網頁裡 @Page 述句中指定的 MasterPage 已經是無效的(會被基底類別所指定的那一頁取代); 事實上你把 MasterPageFile="..." 這一段整個摃掉也無所謂, 因為它已經沒有作用。此外, 你已經可以在 @Page 中指定 Title="...", 就和以前一樣。

但是這麼做並不是毫無代價。由於我們已經在基底類別中指定了 MasterPageFile, 所以所有繼承這個基底類別的網頁都會被迫套用這個 Master Page, 而無法在網頁中自行指定。如果你的不同網頁要套用不同的 Master Page, 但是卻一定要繼承同一個基底類別, 那麼你可能得另外在個別網頁中把基底類別的 PreInit() 給覆寫掉。

 


Dev 2Share @ 點部落