Completely remove ViewState for specific pages

2019-01-15 12:24发布

I have a site that features some pages which do not require any post-back functionality. They simply display static HTML and don't even have any associated code. However, since the Master Page has a <form runat="server"> tag which wraps all ContentPlaceHolders, the resulting HTML always contains the ViewState field, i.e:

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

EDIT: I tried both variants of setting EnableViewState on page level with no luck at all:

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

I realize, that when decrypted, this value of the input field corresponds to the <form> tag which I cannot remove because it is on my master page. However, I would still like to remove the ViewState field for pages that only display static HTML. Is it possible?

8条回答
\"骚年 ilove
2楼-- · 2019-01-15 12:54

ViewState is added only if an asp:Form is present in the page. Remove the Form, and the hidden field will not be rendered.

Beware: By doing this, you are also renouncing to have server-side event handlers, or any kind of PostBack events.

查看更多
Lonely孤独者°
3楼-- · 2019-01-15 12:57

Or just use a simple jQuery line to remove the fields, if you're using AJAX-style postback requests...

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

This removes the DIV encasing the hidden __VIEWSTATE fields.

查看更多
Bombasti
4楼-- · 2019-01-15 13:08
我只想做你的唯一
5楼-- · 2019-01-15 13:13

Add following methods to the page:

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

Result :

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="" />
查看更多
Emotional °昔
6楼-- · 2019-01-15 13:13

in .net4 you can just remove the runat="server" from the form tag. But you can't use server controls inside the form tag once you remove it.

查看更多
太酷不给撩
7楼-- · 2019-01-15 13:17

You could override Render and strip it out with a Regex.

Sample as requested. (NB: Overhead of doing this would almost certainly be greater than any possible benefit though!)

[edit: this function was also useful for stripping all hidden input boxes for using the HTML output as a word doc by changing the MIMEType and file extension]

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);
}
查看更多
登录 后发表回答