2012-01-25 4 views
1

У меня есть сайт ASP.NET. В один момент запускается обратная передача, и некоторые данные изменяются на сервере, и ответ отправляется (с новым состоянием представления). Проблема в том, что я использую jQuery, чтобы отображать только часть этого ответа на странице. Это работает, но у меня проблемы с обновлением состояния представления с новым значением. У меня есть somethig вроде этого:Обновление viewstate из ответа postback

var updatePreviewArea = function (nid) { 
    var $content = jQuery('<div></div>'); 
    $content.load('http://site.com?nid=' + nid, function (response) { 
     var $response = jQuery(response); 

     jQuery('targetDiv1').replaceWith($response.find('#srcDiv1')); 
     jQuery('targetDiv2').replaceWith($response.find('#srcDiv2')); 

     // update viewstate from postback response 
     var selectors = ['#__VIEWSTATE', '#__EVENTVALIDATION']; 
     for (var i in selectors) { 
      var value = $response.find(selectors[i]).val(); 
      jQuery(selectors[i]).val(value); 
     } 
    }); 
} 

Но после этого я получаю:

Sys.WebForms.PageRequestManagerServerErrorException: Sys.WebForms.PageRequestManagerServerErrorException: Проверка ViewState MAC не удалось. Если это приложение размещено кластером Web Farm или , убедитесь, что в конфигурации указан один и тот же код проверки валидации и проверки валидации . AutoGenerate не может использоваться в кластере. ' при вызове метода: [nsIDOMEventListener :: handleEvent]

+0

Является ли страница, которую вы загружаете с помощью jQuery так же, как и исходная страница? У вас есть веб-ферма? –

+0

Это не та же страница, и это не ферма (но я уже установил машинный ключ) – mlaen

ответ

3

Вы принимаете viewstate, которое было возвращено с сервера и обновляло вашу страницу контента. ViewState - это в основном кодированный набор пар имя/значение, которые должны совпадать с содержимым на странице, с которой оно связано. Если вы берете ViewState одной страницы и привязываете ее к другой, зашифрованное значение не будет совпадать, и вы получите сообщение об ошибке, похожее на то, что вы видите.

Поскольку вы используете jQuery и AJAX для динамического получения контента с вашего сервера, я не уверен, почему вы зависите от ViewState (но я не знаком с вашим приложением).

+0

Да, было глупо использовать viewstate с одной страницы на другой. Я переработал код, чтобы использовать ту же страницу. Я унаследовал это приложение, и он будет переписан для использования только ajax/jquery без обратной передачи, но я должен работать до тех пор :) – mlaen

+0

Ahh, унаследованное приложение. Мои соболезнования. :) Удачи вам в переписывании - кажется, что вы на правильном пути! –

+0

-1 @DavidHoerster ViewState вообще не зашифрован, если вы явно не указали asp.net, что вы хотите его зашифровать. Кодирование! = Шифрование. – Icarus

2

Я бы не пошел по этому маршруту (обновляя ViewState вручную), поскольку это непростая задача; по крайней мере, ViewState - это закодированная BASE64 строка, и вам нужно будет написать довольно много кода javascript, чтобы всегда синхронизировать вещи. Я вижу, что это становится кошмаром для поддержания. В вашей обуви я бы использовал строго ajax, вместо этого позволяя post backs вроде этого или позволить MS обрабатывать ViewState для вас и использовать UpdatePanels, но мне тоже это не нравятся.

Кроме того, если ваше приложение по какой-либо причине нуждается в шифровании ViewState, вам не будет весело поддерживать приложение.

1

Закодированный __VIEWSTATE специфичен для страницы, которая сгенерировала его. Вы получите ошибку проверки в представлении, если страница, в которой ваши сообщения формы не соответствуют странице, сгенерированной представлением. У вас есть два варианта:

  1. Отправьте запрос AJAX на странице же, а не на другую страницу.
  2. Задайте URL-адрес сообщения формы URL-адресу другой страницы.
Смежные вопросы