PRB: 「 檢視狀態無效 」 錯誤訊息使用 Server.Transfer 時

文章翻譯 文章翻譯
文章編號: 316920 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

徵狀

當您使用 [HttpServerUtility.Transfer (「 page name",則為 True) 會收到下列錯誤訊息:
檢視狀態無效,此頁面,而且可能已損毀

發生的原因

之所以發生這個問題,是因為 <pages>EnableViewStateMac 屬性 項目設為 true 時根據預設值。當這個屬性設為 true 時,ASP.NET 訊息驗證檢查 (MAC) 上執行的頁面檢視狀態從用戶端回傳頁面時。這項檢查會判斷用戶端上是否已修改頁面的檢視狀態。基於安全理由建議您保留這個屬性設定為 true

當您呼叫 Server.Transfer 方法,而且設定第二個參數 ,則為 True 時,您可以保留 QueryString表單 集合。其中一個表單欄位是保留網頁的檢視狀態隱藏的 __VIEWSTATE 表單欄位。檢視狀態訊息驗證檢查失敗,因為訊息驗證檢查只會檢查每一頁。因此,從呼叫 Server.Transfer 頁面檢視狀態是在 [目的地] 頁面上無效的。

檢視狀態是範圍的頁,而適用於只有該頁面。跨頁,應該不會傳送檢視狀態。

解決方案

如果要解決這個問題,使用下列方法之一。

解決方式 1

若要將您的伺服器控制項的值傳遞至其他頁面的頁面間傳輸值。如需詳細資訊請參閱下列 MSDN 文件:
將伺服器控制項的值傳遞網頁間
http://msdn2.microsoft.com/en-us/library/6c3yckfw(vs.71).aspx
這需要您建立您想要從 [目的地] 頁面存取的控制項的每個屬性的公用屬性。

如果您有許多控制項,而且如果想從另一個頁面中存取這些控制項的屬性您也可以宣告為公用變數這些控制項。例如:

Page1.aspx
Public Class Page1
    Public WithEvents TextBox1 As System.Web.UI.WebControls.TextBox

    'Insert your code here.
End Class
				
Page2.aspx
            Dim sourcePage As Page1
            sourcePage = CType(Context.Handler, WebForm1)
            Response.Write(sourcePage.TextBox1.Text)
				

解析度 2

請勿將傳遞第二個參數 (也就是 false 根據預設值) 當您呼叫 Server.Transfer。例如:
Server.Transfer("<page name>")
				
這個程式碼不會傳送 QueryString表單 欄位至被呼叫的網頁。當傳送沒有資料 ASP.NET 不會執行訊息驗證檢查。

其他相關資訊

重製行為的步驟

  1. 建立名為將執行轉送至其他網頁的 WebForm1.aspx.aspx 網頁。將下列程式碼加入至 WebForm1.aspx:
    <%@ Page language="vb" AutoEventWireup="true" %>
    
    <html>  
      <body>	
        <form id="WebForm1" method="post" runat="server">
          <asp:TextBox id="txtName" runat="server">Your Name</asp:TextBox><br>
          <asp:Button id="Button1" runat="server" Text="Submit" OnClick="Button1_Click"></asp:Button>
        </form>	
      </body>
    </html>
    
    <script runat=server>
    Sub Button1_Click(sender As Object, e As System.EventArgs)
    	Server.Transfer("WebForm2.aspx",true)
    End Sub
    
    </script>
    					
  2. 建立另一個名為 WebForm2.aspx 的.aspx 頁面,然後加入下列程式碼:
    <%@ Page language="vb" AutoEventWireup="true" %>
    
    <html>
      <body>	
        <form id="WebForm2" method="post" runat="server">
          <asp:Label id="lblName" runat="server" >Web Form 2</asp:Label>
        </form>
    	
      </body>
    </html>
    
    <script runat=server>
    Sub Page_Load(sender As Object, e As EventArgs)
    
    Dim thisPage As System.Web.UI.Page
    Dim nameTextBox As TextBox
    
    	thisPage = CType(Context.Handler, System.Web.UI.Page)
    	nameTextBox =  CType(thisPage.FindControl("txtName"), System.Web.UI.Control)
    
    	lblName.Text = "Your name is '" & nameTextBox.Text & "'."	
    	
    End Sub
    
    </script>
    					
  3. 在您的瀏覽器中開啟的 WebForm1.aspx,然後按一下 [送出]。

屬性

文章編號: 316920 - 上次校閱: 2007年4月19日 - 版次: 3.2
這篇文章中的資訊適用於:
  • Microsoft ASP.NET 1.0
關鍵字:?
kbmt kbprb kbstate kbwebforms KB316920 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:316920
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com