国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

VS2010中呈現(xiàn)控件時出錯的解決方法

2024-07-10 13:31:55
字體:
供稿:網(wǎng)友

在制作控件的時候容易遇到“呈現(xiàn)控件時出錯”“發(fā)生了未處理的異常。未將對象引用設(shè)置到對象的實(shí)例。”這樣的錯誤,如下圖:(也有可能僅僅只是因?yàn)槲丛O(shè)置runat="server"標(biāo)簽而導(dǎo)致該錯誤,請先檢查該項。)
但是在編譯時/運(yùn)行時也都是沒有錯誤的。

分析
如圖所示的情況我們稱之為“設(shè)計時”以區(qū)別于“編譯時”/“運(yùn)行時”。

設(shè)計時:在ASP.NET環(huán)境中也就是當(dāng)我們在Visual Studio中使用網(wǎng)頁設(shè)計器進(jìn)行編輯的時候。直接的理解就是在ASPX頁面切換到“設(shè)計”的時候。

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

運(yùn)行時:直接的理解就是當(dāng)你進(jìn)行預(yù)覽/運(yùn)行的時候。通常這個時候的錯誤則是由具體的異常,邏輯錯誤所組成的。
讓我們分析控件在設(shè)計時的表現(xiàn),我們的控件在設(shè)計時的時候,VS智能地模擬輸出控件在運(yùn)行時的樣貌,控件的呈現(xiàn)通過了一定順序的方法,并最終形成了當(dāng)前輸出。按照標(biāo)準(zhǔn),我們應(yīng)該是在Render或RenderContents中對控件進(jìn)行了輸出的操作(事實(shí)上其他也是可以,但我們通常也不那么做,或者說更多的“呈現(xiàn)控件時出錯”的異常主要來自于Render或RenderContents)。
從錯誤的提示“未將對象引用設(shè)置到對象的實(shí)例。”從這一句話來看,也就是說,有一個或者以上的對象的實(shí)例在沒有賦初值的情況下就被使用了。

讓我們窺視一下我們的代碼:

protected override void RenderContents(HtmlTextWriter writer){ UpButton.Text = Page.Server.HtmlDecode(UpButton.Text); DownButton.Text = Page.Server.HtmlDecode(DownButton.Text); base.RenderContents(writer);}

因?yàn)樵摽丶谠O(shè)計的時候需要有一個向上的按鈕和一個向下的按鈕,分別需要用兩個特殊的標(biāo)點(diǎn)符號向上和向下,而這兩個符號需要通過設(shè)置如下所示的代碼編號才可以正確地被瀏覽器呈現(xiàn):

private string upButtonText = "∧";private string downButtonText = "∨";

而這兩個符號在呈現(xiàn)前卻會被頁面進(jìn)行一個HtmlEncode方法編譯后再輸出,而這兩個特殊的標(biāo)志卻只能通過直接輸出的方式進(jìn)行呈現(xiàn),也就是說在HtmlEncode之后只能將該特殊標(biāo)志以文本的形式輸出∧ ∨而不會輸出向上和向下的箭頭。這時候我們需要引入它的反向方法Page.Server.HtmlDecode進(jìn)行解碼,注意到這里我們使用了Page實(shí)例,該實(shí)例只有在頁面真實(shí)存在的情況下才為非空,否則后續(xù)的操作將是對null的操作,而這樣的操作將會顯示“未將對象引用設(shè)置到對象的實(shí)例。”這樣的錯誤。
設(shè)計時:我們剛才提到了,設(shè)計時僅僅只是模擬頁面呈現(xiàn)的過程,而頁面事實(shí)上是不存在的。因此在這個時候Page對象的實(shí)例將為空,后續(xù)的調(diào)用將引發(fā)異常。

假設(shè)說我們只有這個方法用于處理當(dāng)前所需要的行為,那么我們在調(diào)用Page的時候必將導(dǎo)致null的對象并致使后續(xù)操作發(fā)生異常。這個時候我們引入“設(shè)計模式”這個概念(非DesignPattern而是DesignMode),DesignMode是由Control類的一個受保護(hù)的(protected)屬性,它獲取一個值,用以指示該組件當(dāng)前是否處于設(shè)計模式。這里的設(shè)計模式也就相當(dāng)于設(shè)計時的概念。

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

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);}

這樣只有在非設(shè)計時的時候,我們才引入Page對象的實(shí)例,因此設(shè)計時的異常將迎刃而解。

總結(jié)

因此在設(shè)計控件的時候,特別是在考慮控件呈現(xiàn)的時候,為了避免類似異常的發(fā)生,我們應(yīng)該考慮該控件在設(shè)計時能夠獲取足夠的資源,對于未能獲取資源的項,我們應(yīng)該顯式將其區(qū)分(如上代碼中使用DesignMode來判斷是否為設(shè)計時要執(zhí)行的代碼)。

擴(kuò)展

剛才我們所見到的情形可以歸結(jié)為在設(shè)計時無法引用具體實(shí)例所導(dǎo)致的異常,類似該異常的還會有數(shù)據(jù)庫/文件系統(tǒng)讀取、變量未附初值、調(diào)用了類似Page的屬性如Session,Page.Request.QueryString等。在頁面設(shè)計的時候由于以上部分方案特別是調(diào)用到Page的相關(guān)方法的由于頁面總是會存在,因此我們不會經(jīng)常看到它們出異常,在設(shè)計控件的時候我們更應(yīng)該注意。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到ASP.NET教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 伊宁市| 新兴县| 堆龙德庆县| 磐安县| 洮南市| 五华县| 遂昌县| 桐庐县| 珠海市| 浪卡子县| 拉孜县| 同德县| 合山市| 重庆市| 五莲县| 房山区| 建宁县| 武定县| 双辽市| 锦屏县| 信宜市| 西吉县| 靖安县| 新密市| 莒南县| 三河市| 西城区| 乌恰县| 巨野县| 南投县| 琼结县| 濮阳市| 湾仔区| 洪雅县| 无为县| 洪雅县| 长汀县| 大城县| 西安市| 乐山市| 兴文县|