“檢視狀態損壞”的困擾

來源:互聯網
上載者:User

如果你在調試或訪問ASP.NET頁面的時候遇到“此頁的狀態資訊無效,可能已損壞”的異常,我相信你會束手無策的。因為網上能搜到的解決方案和微軟的KB831150,都只會讓你更迷惑。當然,我這裡也不是給出解決方案,而是記錄下我是如何遇到這個問題和如何避開這個問題的,希望對你處於類似情境中時能有所協助。

一、問題回顯

出問題的頁面是一個註冊頁面。裡面用到很多驗證控制項、輸入框、下拉框,其中包含多個自訂驗證控制項,用戶端的驗證方法同時用到了jQuery。

出問題的癥狀是:當使用者填寫了使用者名稱,點擊了“檢查使用者名稱是否可用”,結果顯示在一個id為accountHolder的span裡,然後填完其他項,點擊註冊按鈕,就出現錯誤頁面了。

黃色經典錯誤頁面如下:

一句“沒有相關源行”將我們狠狠推開,無從調試。

通過各種途徑(包括刪掉控制項、刪掉驗證、禁用指令碼等等方法,花了一天多時間哦。結果在這裡一句話就敘述完了,太不甘了)最後將視線定位在了一個用ajax實現的校正重複使用者名稱的javascript方法上。這個javascript方法代碼如下:

Code
function checkAccountExists(){
var name = $("#nameBox").val();

if (validateName(name)){
$.ajax({
type:"POST",
url:"handlers/account.ashx",
cache:false,
data:"name=" + name,
success:function(data){
$("#accountHolder").html(data);
},
error:function(data){
$("#accountHolder").html("系統異常,未能核對帳戶名稱。");
}
});
}else{
$("#accountHolder").html("");
}
}

 

其中validateName(name)是一個正則測試方法。

由於這個錯誤難以調試,現在就寄希望於HttpWath能給我們一些提示了。

二、HTTP請求和響應資訊

用HttpWath可以跟蹤請求,來看一個出現錯誤後的吧:

ajax請求的地址是CheckAccountExists.aspx,這個頁面用Response.Write返回校正的結果,我以為是POST的問題,把方法改成了GET(點擊看大圖):

無論POST還是GET擷取校正結果,都返回500,也就是都返回黃色頁面。到這裡我已經很著急了,無論怎麼調整控制項和禁用指令碼,它依然出錯。

後來把ajax的請求換了一種方式處理,換成了一個Handler(實現IHttpHandler)來處理使用者名稱校正,居然沒有出錯了。可以看看監測到的請求響應流:

上面是POST擷取,下面是GET方式(點擊看大圖):

由於每次測試的時候我都清空了瀏覽器Cache和輸入的相同資料,保證每次POST back的資料相同,你可以從上面的裡看出來,用aspx作為ajax響應端的時候發送的資料是2058b,而用Handler的時候是1987b。這多出來的一部分是哪裡來的呢?

三、結論

可能你已經發現了,可是我卻經過了千辛萬苦才發現啊。

從前兩張HTTPWatch的看出,在用aspx頁面當後台ajax響應的時候,不僅僅請求了aspx頁面,還有兩個css檔案,這是因為aspx頁面裡有HTML代碼,把css檔案包含了進來,而且HTML代碼裡還有一個伺服器端的form,問題就在這裡!

用一般處理常式就不會存在這樣的問題。因為它返回的東西必須由你來完成,因而也有了全部的控制權。

當然你也可以用aspx來作為ajax的幕後處理程式,那麼請把aspx頁面的所有HTML代碼刪除掉,只保留@Page聲明這一行即可,結果是:

謎題終於解開了。

結論是,修改別人的程式真的是很惱火的一件事,更惱火的是別人的程式還寫得不好。合作的煩惱也因此而生。

另外關於排錯,有的時候要到最後才能發現錯誤的根源,這也是相當鬱悶的一件事。我之前就很不喜歡ASP.NET的Post back機制,原因之一是因為ViewState等控制項在頁面上太影響美觀了。

四、參考資源

關於檢視狀態,或許你要參考如下地址:

ASP.NET 檢視狀態概述

TRULY Understanding ViewState

微軟中文技術論壇(MSDN and TechNet)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.