2010-03-12 103 views
15

我有一個網站,其特點是一些頁面,不需要任何後回功能。他們只是顯示靜態 HTML,甚至沒有任何關聯的代碼。然而,由於母版頁有一個<form runat="server">標籤,它封裝了所有ContentPlaceHolder s,則所得HTML總是包含ViewState的領域,即:完全刪除特定頁面的ViewState

<input 
    type="hidden" 
    id="__VIEWSTATE" 
    value="/wEPDwUKMjEwNDQyMTMxM2Rk0XhpfvawD3g+fsmZqmeRoPnb9kI=" 
/> 

編輯:我想在頁面級別設置EnableViewState的兩種變體沒有運氣可言:

<%@ Page Language="C#" EnableViewState="false" %> 
<%@ Page Language="C#" EnableViewState="true" %> 

我意識到,那解密時,該input場的這個值對應於<form>標籤,我不能刪除,因爲這是對我的MAS ter頁面。但是,我仍然想爲僅顯示靜態HTML的頁面移除ViewState字段。可能嗎?

+0

將您的靜態文件重命名爲.html或在頁面指令中將EnableViewState設置爲false。 – 2010-03-12 13:25:56

回答

23

你可以覆蓋渲染並用正則表達式去掉它。

根據要求採樣。 (注意:這樣做的開銷幾乎肯定會大於任何可能的好處,雖然!)

[編輯:此功能也可用於剝離所有隱藏的輸入框,以便將HTML輸出用作word文檔,方法是更改​​MIMEType和文件擴展名]

protected override void Render(HtmlTextWriter output) 
{ 
    StringWriter stringWriter = new StringWriter(); 

    HtmlTextWriter textWriter = new HtmlTextWriter(stringWriter); 
    base.Render(textWriter); 

    textWriter.Close(); 

    string strOutput = stringWriter.GetStringBuilder().ToString(); 

    strOutput = Regex.Replace(strOutput, "<input[^>]*id=\"__VIEWSTATE\"[^>]*>", "", RegexOptions.Singleline); 

    output.Write(strOutput); 
} 
+0

小心提供一個樣本? – Kerido 2010-03-12 13:56:49

+0

NB應該用粗體,20pt全部大寫而不是括號括起來。這是谷歌最重要的結果之一,人們**會使用這些代碼,即使他們不應該這樣做。我保證。 – 2016-06-29 10:58:03

4

在頁面頂部的<%@page ...指令中,添加EnableViewState =「False」。這將阻止該特定頁面的ViewState。

+2

事實已經如此。但是,該領域仍然存在。我更新了這個問題 – Kerido 2010-03-12 13:42:07

+3

這不起作用 – 2012-12-05 14:47:32

3

由馬丁提出的方法必須非常小心地使用;因爲馬丁在括號內指出,它可能會在您的網頁中引起意想不到的行爲。我實際上經歷過它。但還有另一個選項可以安全地從頁面中刪除視圖狀態內容。

該選項讓您能夠使用viewstate而不設置false,它還允許您從頁面中刪除它。請檢查下面的文章:

1- http://www.eggheadcafe.com/articles/20040613.asp

2- http://aspalliance.com/72

有根據彼得的文章[1],你可以下載一個拉鍊解決方案文件。我建議你閱讀彼得引用的第二篇文章。這是一個完美的解決方案,可以在使用其功能的同時從頁面中移除視圖狀態內容。

13

添加下面的方法到頁面:

 protected override void SavePageStateToPersistenceMedium(object state) 
    { 
     //base.SavePageStateToPersistenceMedium(state); 
    } 

    protected override object LoadPageStateFromPersistenceMedium() 
    { 
     return null; //return base.LoadPageStateFromPersistenceMedium(); 
    } 

    protected override object SaveViewState() 
    { 
     return null;// base.SaveViewState(); 
    } 

結果:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="" /> 
+1

真棒,謝謝! – Craig 2013-09-24 23:23:27

+1

@Craig:不客氣,但我已經離開了asp頁面和mvc,我更喜歡Angularjs和webservices,所以在asp.net中有很多解決方法是不需要的。 – Arjang 2013-09-25 01:04:30

0

ViewState中添加只有一個asp:形式出現在頁面中。刪除窗體,隱藏的字段將不會呈現。

請注意:通過這樣做,您也將放棄使用服務器端事件處理程序或任何類型的回發事件。

0

或者只是使用一個簡單的jQuery行刪除字段,如果你正在使用AJAX式回發的請求......

$(".aspNetHidden").remove(); 

這將刪除DIV包圍隱藏__VIEWSTATE字段。

+0

簡單而高效: $(document#).ready(function(){ setTimeout(function(){(#__ VIEWSTATE「)。remove(); $(」#__ VIEWSTATEGENERATOR「)。 },300); }); – 2017-04-04 14:04:49

0

in .net4您可以從form標記中刪除runat="server"。但是一旦刪除它,您就不能在form標籤內使用服務器控件。

+0

這樣做的工作! – 2015-05-06 17:24:54