#asp.net #viewstate
#asp.net #состояние просмотра
Вопрос:
Я создал UserControl, который реализует поведение «Нравится» в стиле facebook.
При нажатии «Нравится» (или «В отличие») элемент управления отправляет запрос службе WCF с поддержкой Ajax, которая, в свою очередь, вручную отображает usercontrol и отправляет результат обратно клиенту.
Все это работает хорошо, однако это приводит к тому, что другие элементы управления на той же странице генерируют следующую ошибку JavaScript:
Message: Sys.WebForms.PageRequestManagerServerErrorException: The state information is invalid for this page and might be corrupted.
URI: http://somesite/ScriptResource.axd?d=GF84PA...
Ошибка возникает, только если я нажимаю кнопки «Нравится» / «Не похоже», а затем пытаюсь выполнить что-либо на странице, требующее обратного вызова, например, подкачку в ListView или отправку комментария.
Я использую C #, ASP.NET, .NET 3.5.
Редактировать: Мой код рендеринга UserControl в WCF выглядит следующим образом:
public string RenderHtml()
{
var pageHolder = new Page();
var formControl = new HtmlForm();
var userControl = (TControl)pageHolder.LoadControl(userControlPath);
if (setControlPropertiesDelegate != null)
setControlPropertiesDelegate(userControl);
formControl.Controls.Add(userControl);
pageHolder.Controls.Add(formControl);
var output = new StringWriter();
HttpContext.Current.Server.Execute(pageHolder, output, false);
var outputString = output.ToString();
return outputString;
}
Я обнаружил, что, поскольку я отображаю элемент управления внутри страницы и формы, создается скрытое поле ViewState (и, таким образом, отправляется клиенту через WCF).
Я добавил метод непосредственно перед оператором return, который удаляет тег формы и ViewState, поэтому отправляется только отображаемая строка управления. Теперь это работает просто отлично.
Комментарии:
1. Во-первых, если вы отключаете viewstate и продолжаете получать ошибку, то, вероятно, это потому, что вы вносите некоторые изменения на html-странице после рендеринга, или вы осуществляете прямую запись на странице и меняете некоторые элементы управления. Я предлагаю найти проблему, потому что даже если вы ее отключили, у вас по-прежнему будут проблемы со страницей, и ваши кнопки не будут работать. Я думаю, что EnableEventValidation =»false» отправит это сообщение, но ваши кнопки не будут работать из-за этой ошибки.
2. Привет, я обнаружил, что проблема связана с файлом «ScriptResource.axd». Я отредактирую вопрос, чтобы сделать его более понятным.
3. Проблема не обязательно в этом — ScriptResource.axd — это просто файл ресурсов, где ASP.NET JavaScript извлекается из. Тот факт, что исключение исходит из
Sys.WebForms...
означает, что оно генерируется javascript. Возможно, вам потребуется отредактировать свой вопрос, чтобы объяснить, как вы вызываете службу и что вы делаете со страницей после ее вызова.4. Привет, я заметил, что мой WCF возвращает поле ввода VIEWSTATE (при рендеринге UserControl). Я удалил его, и теперь он работает.
Ответ №1:
Все элементы управления используют ViewState для хранения свойств и настроек. Даже если вы отключите его вручную, все равно останется небольшое количество ViewState, которое будет сгенерировано внутри элемента управления. Если вы возвращаете HTML-код отображаемого элемента управления из службы WCF, а затем отправляете страницу обратно на сервер, будет выдана ошибка, потому что Страница ничего не знает об элементе управления, который вы динамически загрузили, когда она расшифровывает ViewState для перестройки страницы.
Как вы упомянули в комментарии к вашему вопросу, удаление ViewState вручную перед отправкой HTML клиенту решит вашу проблему.
Я настоятельно рекомендую прочитать эту статью о ViewState Дэйва Рида. Это, безусловно, лучшее объяснение того, как именно работает ViewState (и какие у вас могут быть неправильные представления об этом).