2012-10-10 44 views
1

我在form標籤設置action並獲得以下錯誤:設定動作,產生錯誤「視圖狀態MAC驗證失敗......」

視圖狀態MAC的驗證失敗。如果此應用程序由Web Farm或羣集託管,請確保配置指定相同的驗證密鑰和驗證算法。 AutoGenerate不能在羣集中使用。

我曾嘗試以下的事情:在web.config中

  1. 套機配置的關鍵。
  2. 集EnableViewStateMac在
  3. = 「假」 設置ViewStateEncryptionMode = 「從不」
  4. 設置EnableEventValidation = 「假」

,但沒有運氣。

請指點。

Thakns爲您提供幫助和分享。

編輯:

這裏是我的網頁的標記。

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" 
EnableViewStateMac="false" ViewStateEncryptionMode="Never" EnableEventValidation="false" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="aspnetForm" method="post" action="Test.aspx" runat="server"> 
    <div> 
     <asp:TextBox runat="server" ID="txt1"></asp:TextBox><br /> 
     <asp:TextBox runat="server" ID="txt2"></asp:TextBox><br /> 
     <asp:Button runat="server" ID="btn" Text="Click" /> 
    </div> 
    </form> 
</body> 
</html> 
+0

請從您的項目/視圖共享標記/格式 –

+0

@GlennFerrieLive,請參閱我的編輯。謝謝 – user576510

+0

爲什麼EnableViewStateMac設置爲false?如果將其設置爲True,會發生什麼情況? – CptSupermrkt

回答

1

我建議你重寫頁面的渲染事件到地方加密視圖狀態和事件驗證隱藏字段在窗體的頂部。這將確保在提交表單的任何內容之前將這些內容寫出來。

protected override void Render(System.Web.UI.HtmlTextWriter writer) 
{ 
    System.IO.StringWriter stringWriter = 
     new System.IO.StringWriter(); 
    HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter); 
    base.Render(htmlWriter); 
    string html = stringWriter.ToString(); 
    string[] aspnet_formelems = new string[5]; 
    aspnet_formelems[0] = "__EVENTTARGET"; 
    aspnet_formelems[1] = "__EVENTARGUMENT"; 
    aspnet_formelems[2] = "__VIEWSTATE"; 
    aspnet_formelems[3] = "__EVENTVALIDATION"; 
    aspnet_formelems[4] = "__VIEWSTATEENCRYPTED"; 
    foreach (string elem in aspnet_formelems) 
    { 
    //Response.Write("input type=""hidden"" name=""" & abc.ToString & """") 
    int StartPoint = html.IndexOf("<input type=\"hidden\" name=\"" + 
     elem.ToString() + "\""); 
    if (StartPoint >= 0) 
    { 
     //does __VIEWSTATE exist? 
     int EndPoint = html.IndexOf("/>", StartPoint) + 2; 
     string ViewStateInput = html.Substring(StartPoint, 
     EndPoint - StartPoint); 
     html = html.Remove(StartPoint, EndPoint - StartPoint); 
     int FormStart = html.IndexOf("<form"); 
     int EndForm = html.IndexOf(">", FormStart) + 1; 
     if (EndForm >= 0) 
     html = html.Insert(EndForm, ViewStateInput); 
    } 
    } 

    writer.Write(html); 
} 
+0

感謝@Aghilas Yakoub,我只是在C#默認頁面中刪除了這段代碼。後來我檢查它是否導致viewstate和eventarugments字段在表單打開標籤後立即渲染,但錯誤仍然存​​在。 有什麼建議嗎? – user576510

+0

我很樂意爲您提供幫助user576510,您還可以將表單標記爲禁用,然後在加載完成後在腳本中啓用它: function enableForm(){ document.getElementById(「form」)。disabled = false ; } window.onLoad = enableForm(); (另一種解決方案) –

+0

Aghilas Yakoub再次感謝。你能否也請提一下你提供的上述代碼中的不正確內容?或者我應該做些什麼才能使其正常工作。 再次感謝。 – user576510

1

添加以下代碼會在 「Test.aspx文件」,然後再次嘗試

EnableViewStateMac = 「假」 ViewStateEncryptionMode = 「從不」 EnableEventValidation = 「假」

+0

謝謝@Sathish Raja S. Test.aspx將是使用SSL/https的安全頁面。這些設置將如何影響它?請指教。 – user576510

1

你得到這個錯誤時,作爲POST請求的一部分發送的ViewState與控件集合不匹配。

頁收到您的請求是Test.aspx

Test.aspxEnableViewStateMac="false"和你的問題應該得到解決。

+0

謝謝。 Test.aspx將成爲使用SSL/https的安全頁面。 EnableViewStateMac = fasle會對此產生什麼影響?請指教。 – user576510

+0

https用於避免中間人攻擊。這個設置對它沒有影響。 Asp.net使用MAC來驗證控制狀態(像沒有人設置禁用控件的文本一樣檢查)。這些驗證不會完成。這意味着你將不得不驗證你自己收到的數據。請注意,控件會將大量數據保存在ViewState中。 – nunespascal

3

如果更改表單標籤和按鈕的標記,則可以完成跨頁面發佈。

步驟:從形式

  • 附加 '一項PostBackUrl' 到按鈕
  • +0

    無法將HTML代碼樣本粘貼到編輯器中。嗯 –