2012-01-25 32 views
1

我有ASP.NET網站。在某一時間點,回發被觸發並且一些數據在服務器上被修改並且響應被髮送(具有新的視圖狀態)。 問題是我使用jQuery僅在頁面上顯示該響應的一部分。這有效,但我在更新視圖狀態和新值時遇到問題。 我somethig這樣的:從回發回復更新viewstate

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: 視圖狀態MAC的驗證失敗。如果此應用程序由Web Farm或 羣集託管,請確保配置指定相同的 validationKey和驗證算法。 AutoGenerate無法在 羣集中使用。'當調用方法:[nsIDOMEventListener :: handleEvent]

+0

您正在加載jQuery的頁面與原始頁面相同嗎?你有網站嗎? –

+0

這是不一樣的頁面,它不是一個農場(但我已經設置了機器密鑰) – mlaen

回答

3

您正在使用從服務器返回的視圖狀態並使用它更新您的內容頁面。 ViewState基本上是一組經過編碼的名稱/值對,需要與其相關頁面上的內容相匹配。如果您將一個頁面的ViewState粘貼到另一個頁面上,那麼加密的值將不匹配,您將看到與您所看到的類似的錯誤。

由於您使用jQuery和AJAX從您的服務器動態獲取內容,我不確定您爲什麼依賴於ViewState(但我不熟悉您的應用程序)。

+0

是的,從另一個頁面使用viewstate是愚蠢的。我重構了代碼,以便使用相同的頁面。我已經繼承了這個應用程序,它將被重寫爲僅使用ajax/jquery而沒有回傳,但我必須工作到那時:) – mlaen

+0

啊,繼承的應用程序。節哀順變。 :)祝你好運重寫 - 聽起來像你在正確的道路上! –

+0

-1 @DavidHoerster ViewState根本不加密,除非你明確告訴asp.net你想加密它。編碼!=加密。 – Icarus

2

我不會去這條路線(手動更新ViewState),因爲這不是一件容易的事情;至少,ViewState是一個BASE64編碼的字符串,你必須編寫相當多的javascript代碼才能保持同步。我認爲這成爲一個噩夢來維持。在你的鞋子裏,我會嚴格使用ajax來代替這個帖子,或讓MS爲你處理ViewState,並使用UpdatePanels,但我也不喜歡這些。此外,如果您的應用出於某種原因需要加密ViewState,那麼您將無法保持您的應用的樂趣。

1

編碼的__VIEWSTATE特定於生成它的頁面。如果表單發佈的頁面與生成視圖狀態的頁面不匹配,您將會收到視圖狀態驗證錯誤。你有兩個選擇:

  1. 發送您的AJAX請求相同頁面,而不是一個不同的頁面。
  2. 將表單的帖子URL設置爲其他頁面的URL。