如何解決「呈現控制項時出錯」的問題

2021-09-08 14:34:15 字數 2131 閱讀 1221

在製作控制項的時候容易遇到「呈現控制項時出錯」「發生了未處理的異常。未將物件引用設定到物件的例項。」這樣的錯誤,如下圖:(也有可能僅僅只是因為未設定runat="server"標籤而導致該錯誤,請先檢查該項。)

但是在編譯時/執行時也都是沒有錯誤的。

分析

如圖所示的情況我們稱之為「設計時」以區別於「編譯時」/「執行時」。

編譯時:直接的理解就是當你進行編譯的時候,通常這個時候的錯誤是由型別檢查,引數匹配等顯式可直接通過語法約束所限制的錯誤。

執行時:直接的理解就是當你進行預覽/執行的時候。通常這個時候的錯誤則是由具體的異常,邏輯錯誤所組成的。

讓我們分析控制項在設計時的表現,我們的控制項在設計時的時候,vs智慧型地模擬輸出控制項在執行時的樣貌,控制項的呈現通過了一定順序的方法,並最終形成了當前輸出。按照標準,我們應該是在render或rendercontents中對控制項進行了輸出的操作(事實上其他也是可以,但我們通常也不那麼做,或者說更多的「呈現控制項時出錯」的異常主要來自於render或rendercontents)。

從錯誤的提示「未將物件引用設定到物件的例項。」從這一句話來看,也就是說,有乙個或者以上的物件的例項在沒有賦初值的情況下就被使用了。

讓我們窺視一下我們的**:

protected

override

void rendercontents(htmltextwriter writer)

因為該控制項在設計的時候需要有乙個向上的按鈕和乙個向下的按鈕,分別需要用兩個特殊的標點符號向上和向下,而這兩個符號需要通過設定如下所示的**編號才可以正確地被瀏覽器呈現:

private

string upbuttontext = "∧";

private

string downbuttontext = "∨";

而這兩個符號在呈現前卻會被頁面進行乙個htmlencode方法編譯後再輸出,而這兩個特殊的標誌卻只能通過直接輸出的方式進行呈現,也就是說在htmlencode之後只能將該特殊標誌以文字的形式輸出∧ ∨而不會輸出向上和向下的箭頭。這時候我們需要引入它的反向方法page.server.htmldecode進行解碼,注意到這裡我們使用了page例項,該例項只有在頁面真實存在的情況下才為非空,否則後續的操作將是對null的操作,而這樣的操作將會顯示「未將物件引用設定到物件的例項。」這樣的錯誤。

設計時:我們剛才提到了,設計時僅僅只是模擬頁面呈現的過程,而頁面事實上是不存在的。因此在這個時候page物件的例項將為空,後續的呼叫將引發異常。

假設說我們只有這個方法用於處理當前所需要的行為,那麼我們在呼叫page的時候必將導致null的物件並致使後續操作發生異常。這個時候我們引入「設計模式」這個概念(非designpattern而是designmode),designmode是由control類的乙個受保護的(protected)屬性,它獲取乙個值,用以指示該元件當前是否處於設計模式。這裡的設計模式也就相當於設計時的概念。

因此我們可以將**改造為如下形式:

protected

override

void rendercontents(htmltextwriter writer)

base.rendercontents(writer);

}

這樣只有在非設計時的時候,我們才引入page物件的例項,因此設計時的異常將迎刃而解。

總結

因此在設計控制項的時候,特別是在考慮控制項呈現的時候,為了避免類似異常的發生,我們應該考慮該控制項在設計時能夠獲取足夠的資源,對於未能獲取資源的項,我們應該顯式將其區分(如上**中使用designmode來判斷是否為設計時要執行的**)。

擴充套件

剛才我們所見到的情形可以歸結為在設計時無法引用具體例項所導致的異常,類似該異常的還會有資料庫/檔案系統讀取、變數未附初值、呼叫了類似page的屬性如session,page.request.querystring等。在頁面設計的時候由於以上部分方案特別是呼叫到page的相關方法的由於頁面總是會存在,因此我們不會經常看到它們出異常,在設計控制項的時候我們更應該注意。

如何解決「呈現控制項時出錯」的問題

在製作控制項的時候容易遇到 呈現控制項時出錯 發生了未處理的異常。未將物件引用設定到物件的例項。這樣的錯誤,如下圖 也有可能僅僅只是因為未設定runat server 標籤而導致該錯誤,請先檢查該項。但是在編譯時 執行時也都是沒有錯誤的。分析 如圖所示的情況我們稱之為 設計時 以區別於 編譯時 執行...

如何解決控制項附件上傳時超大附件無法上傳的問題

起因 我們的附件控制項裡邊,一般情況下預設設定大小為10m,如果我們設定30m的情況,就無法滿足上傳了。原因 是因為我們ajax的乙個檔案裡取我們控制項自定義大小的值,無法取到。因為我們傳的int型別的值,所以我們在用querystring取的時候的值為null。解決 開啟portal ajax f...

如何解決mysql stop fail的問題

最近在學習mysql,碰到了乙個mysql stop fail的問題,在這裡把碰到的問題以及解決的過程寫出來,不是這個問題有多難,而是我在解決此問題的過程中沒有發現乙個行之有效的解決問題的中文網頁,搞得白白浪費了很多時間。在這裡我把解決的過程寫下來,希望給後來者解決相同的問題節省點時間。好了,廢話不...