首頁 後端開發 C#.Net教程 VS2010中呈現控制項時出錯的解決方法

VS2010中呈現控制項時出錯的解決方法

Jan 11, 2017 am 10:44 AM

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

分析

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

設計時:在ASP.NET環境中也就是當我們在Visual Studio中使用網頁設計器進行編輯的時候。直接的理解就是在ASPX頁面切換到「設計」的時候。

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


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

讓我們分析控制在設計時的表現,我們的控制在設計時的時候,VS智能地模擬輸出控制在運行時的樣貌,控制的呈現通過了一定順序的​​方法,並最終形成了當前輸出。依照標準,我們應該是在Render或RenderContents中對控制進行了輸出的操作(事實上其他也是可以,但我們通常也不那麼做,或者說更多的「呈現控制時出錯」的異常主要來自於Render或RenderContents)。
從錯誤的提示「未將物件參考設定到物件的實例。」從這句話來看,也就是說,有一個或以上的物件的實例在沒有賦初值的情況下就被使用了。

讓我們窺視一下我們的程式碼:

protected override void RenderContents(HtmlTextWriter writer)
{
 UpButton.Text = Page.Server.HtmlDecode(UpButton.Text);
 DownButton.Text = Page.Server.HtmlDecode(DownButton.Text);
 base.RenderContents(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)
{
 if (!DesignMode)
 {
 UpButton.Text = Page.Server.HtmlDecode(UpButton.Text);
 DownButton.Text = Page.Server.HtmlDecode(DownButton.Text);
 }
 base.RenderContents(writer);
}
登入後複製

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

總結


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


擴充


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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持PHP中文網。

更多VS2010中呈現控制時出錯的解決方法相關文章請關注PHP中文網!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

char在C語言字符串中的作用是什麼 char在C語言字符串中的作用是什麼 Apr 03, 2025 pm 03:15 PM

在 C 語言中,char 類型在字符串中用於:1. 存儲單個字符;2. 使用數組表示字符串並以 null 終止符結束;3. 通過字符串操作函數進行操作;4. 從鍵盤讀取或輸出字符串。

C語言各種符號的使用方法 C語言各種符號的使用方法 Apr 03, 2025 pm 04:48 PM

C 語言中符號的使用方法涵蓋算術、賦值、條件、邏輯、位運算符等。算術運算符用於基本數學運算,賦值運算符用於賦值和加減乘除賦值,條件運算符用於根據條件執行不同操作,邏輯運算符用於邏輯操作,位運算符用於位級操作,特殊常量用於表示空指針、文件結束標記和非數字值。

char在C語言中如何處理特殊字符 char在C語言中如何處理特殊字符 Apr 03, 2025 pm 03:18 PM

C語言中通過轉義序列處理特殊字符,如:\n表示換行符。 \t表示製表符。使用轉義序列或字符常量表示特殊字符,如char c = '\n'。注意,反斜杠需要轉義兩次。不同平台和編譯器可能有不同的轉義序列,請查閱文檔。

c#多線程和異步的區別 c#多線程和異步的區別 Apr 03, 2025 pm 02:57 PM

多線程和異步的區別在於,多線程同時執行多個線程,而異步在不阻塞當前線程的情況下執行操作。多線程用於計算密集型任務,而異步用於用戶交互操作。多線程的優勢是提高計算性能,異步的優勢是不阻塞 UI 線程。選擇多線程還是異步取決於任務性質:計算密集型任務使用多線程,與外部資源交互且需要保持 UI 響應的任務使用異步。

char與wchar_t在C語言中的區別 char與wchar_t在C語言中的區別 Apr 03, 2025 pm 03:09 PM

在 C 語言中,char 和 wchar_t 的主要區別在於字符編碼:char 使用 ASCII 或擴展 ASCII,wchar_t 使用 Unicode;char 佔用 1-2 個字節,wchar_t 佔用 2-4 個字節;char 適用於英語文本,wchar_t 適用於多語言文本;char 廣泛支持,wchar_t 依賴於編譯器和操作系統是否支持 Unicode;char 的字符範圍受限,wchar_t 的字符範圍更大,並使用專門的函數進行算術運算。

char在C語言中如何進行類型轉換 char在C語言中如何進行類型轉換 Apr 03, 2025 pm 03:21 PM

在 C 語言中,char 類型轉換可以通過:強制類型轉換:使用強制類型轉換符將一種類型的數據直接轉換為另一種類型。自動類型轉換:當一種類型的數據可以容納另一種類型的值時,編譯器自動進行轉換。

char數組在C語言中如何使用 char數組在C語言中如何使用 Apr 03, 2025 pm 03:24 PM

char 數組在 C 語言中存儲字符序列,聲明為 char array_name[size]。訪問元素通過下標運算符,元素以空終止符 '\0' 結尾,用於表示字符串終點。 C 語言提供多種字符串操作函數,如 strlen()、strcpy()、strcat() 和 strcmp()。

C語言 sum 的作用是什麼? C語言 sum 的作用是什麼? Apr 03, 2025 pm 02:21 PM

C語言中沒有內置求和函數,需自行編寫。可通過遍歷數組並累加元素實現求和:循環版本:使用for循環和數組長度計算求和。指針版本:使用指針指向數組元素,通過自增指針遍歷高效求和。動態分配數組版本:動態分配數組並自行管理內存,確保釋放已分配內存以防止內存洩漏。

See all articles