Полностью удалите 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 с вашей страницы при использовании его возможностей.
Ответ 5
Всегда будет ViewState. См. Этот связанный вопрос:
Почему скрытое поле __VIEWSTATE получает визуализацию, даже если у меня установлено значение EnableViewState равным false
Ответ 6
ViewState добавляется только в том случае, если на странице присутствует asp: Form. Удалите форму, и скрытое поле не будет отображаться.
Остерегайтесь: делая это, вы также отказываетесь от серверных обработчиков событий или любых событий PostBack.
Ответ 7
Или просто используйте простую строку jQuery для удаления полей, если вы используете обратные запросы в стиле AJAX...
$(".aspNetHidden").remove();
Это удаляет DIV, закрывая скрытые поля __VIEWSTATE.
Ответ 8
в .net4 вы можете просто удалить runat="server"
из тега form
. Но вы не можете использовать серверные элементы управления в теге form
после его удаления.