在表单标记中设置操作会生成错误“viewstate MAC验证失败...”

时间:2012-10-10 03:10:21

标签: c# asp.net .net

我在action代码中设置form并收到以下错误:

对viewstate MAC的验证失败。如果此应用程序由Web场或群集托管,请确保配置指定相同的validationKey和验证算法。无法在群集中使用AutoGenerate。

我尝试了以下事项:

  1. 在web.config中设置计算机配置密钥。
  2. 在页面
  3. 中设置EnableViewStateMac =“false”
  4. 设置ViewStateEncryptionMode =“从不”
  5. 设置EnableEventValidation =“false”
  6. 但没有运气。

    请指导。

    感谢您的帮助和分享。

    修改

    这是我页面的标记。

    <%@ 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>
    

4 个答案:

答案 0 :(得分:3)

如果更改了表单标签和按钮的标记,则可以完成跨页面发布。

步骤:

  • 从表单
  • 中删除“操作”
  • 将'PostbackUrl'添加到按钮

=============================================== ==========

MSDN: ASP.NET中的跨页面发布

概述:http://msdn.microsoft.com/en-us/library/ms178139(v=vs.100).aspx

操作方法:http://msdn.microsoft.com/en-us/library/ms178140(v=vs.100).aspx

=============================================== ==========

<form id="aspnetForm" method="post" 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" PostBackUrl="~/Test.aspx" />
</div>
</form>

答案 1 :(得分:1)

我建议您覆盖页面的渲染事件,将加密的Viewstate和事件验证的隐藏字段放在窗体的顶部。这将确保在提交表单的任何内容之前写出这些内容。

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);
}

答案 2 :(得分:1)

在&#34; Test.Aspx&#34;中添加以下标签然后再试一次

EnableViewStateMac =&#34;假&#34; ViewStateEncryptionMode =&#34;决不&#34; EnableEventValidation =&#34;假&#34;

答案 3 :(得分:1)

当作为POST请求的一部分发送的ViewState与控件集合不匹配时,会出现此错误。

接收您请求的页面为Test.aspx

EnableViewStateMac="false"上设置Test.aspx,您的问题就会得到解决。