Полностью удалите ViewState для определенных страниц

У меня есть сайт, на котором есть некоторые страницы, для которых не требуются функции обратной связи. Они просто отображают статический HTML и даже не имеют связанного с ним кода. Однако, поскольку главная страница имеет тег <form runat="server">, который обертывает все ContentPlaceHolder s, полученный HTML всегда содержит поле ViewState, то есть:

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

EDIT: Я попробовал оба варианта установки EnableViewState на уровне страницы без каких-либо удачных действий:

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

Я понимаю, что при расшифровке это значение поля input соответствует тегу <form>, который я не могу удалить, потому что он находится на моей главной странице. Тем не менее, я все равно хотел бы удалить поле ViewState для страниц, на которых отображается только статический HTML. Возможно ли это?

Ответы

Ответ 1

Вы можете переопределить Render и удалить его с помощью регулярного выражения.

Образец в соответствии с запросом. (NB: Накладные расходы на это почти наверняка будут больше, чем любая возможная выгода!)

[edit: эта функция также полезна для удаления всех скрытых полей ввода для использования вывода HTML в виде слова doc путем изменения 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);
}

Ответ 2

Добавьте на страницу следующие методы:

        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="" />

Ответ 3

В директиве <% @page... в верхней части страницы добавьте EnableViewState = "False". Это предотвратит просмотр ViewState для этой конкретной страницы.

Ответ 4

Метод, предложенный Мартином, должен использоваться очень осторожно; потому что это может вызвать неожиданное поведение на ваших страницах, как указал Мартин в круглых скобках. Я действительно испытал это. Но есть еще одна возможность безопасного удаления содержимого списка из страницы.

Этот параметр дает вам возможность использовать viewstate без установки false, а также позволяет удалить его со своих страниц. Пожалуйста, ознакомьтесь с приведенными ниже статьями:

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

2- http://aspalliance.com/72

Существует файл решения, заархивированный в статье Peter [1], которую вы можете скачать. Я рекомендую вам прочитать вторую статью, также упоминаемую Петром. Это идеальное решение для удаления содержимого viewstate с вашей страницы при использовании его возможностей.

Ответ 6

ViewState добавляется только в том случае, если на странице присутствует asp: Form. Удалите форму, и скрытое поле не будет отображаться.

Остерегайтесь: делая это, вы также отказываетесь от серверных обработчиков событий или любых событий PostBack.

Ответ 7

Или просто используйте простую строку jQuery для удаления полей, если вы используете обратные запросы в стиле AJAX...

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

Это удаляет DIV, закрывая скрытые поля __VIEWSTATE.

Ответ 8

в .net4 вы можете просто удалить runat="server" из тега form. Но вы не можете использовать серверные элементы управления в теге form после его удаления.