【问题标题】:Postback not working with ASP.NET Routing (Validation of viewstate MAC failed)回发不适用于 ASP.NET 路由(视图状态 MAC 验证失败)
【发布时间】:2010-09-18 19:17:59
【问题描述】:

我正在使用带有经典 WebForms 的 ASP.NET 3.5 SP1 System.Web.Routing,如 http://chriscavanagh.wordpress.com/2008/04/25/systemwebrouting-with-webforms-sample/ 中所述

一切正常,我有自定义 SEO 网址,甚至回发也可以。 但有一种情况是回发总是失败,我得到一个:

视图状态 MAC 验证失败。如果此应用程序由 Web Farm 或集群托管,请确保配置指定相同的 validationKey 和验证算法。 AutoGenerate 不能在集群中使用。

这里是重现错误的场景:

  1. 使用按钮创建标准 webform mypage.aspx
  2. 创建一个将“a/b/{id}”映射到“~/mypage.aspx”的路由
  3. 当您执行站点时,您可以导航http://localhost:XXXX/a/b/something 页面工作。但是当您按下按钮时,您会收到错误消息。当 Route 只是“a/{id}”时,不会发生错误。

好像和url中子路径的个数有关。如果至少有 2 个子路径,则视图状态验证失败。

即使 EnableViewStateMac="false" 也会出现错误。

有什么想法吗?是bug吗?

谢谢

【问题讨论】:

    标签: asp.net-mvc routing viewstate mac-address


    【解决方案1】:

    只需尝试清除本地计算机上的 cookie。有同样的问题,这有帮助。

    【讨论】:

      【解决方案2】:

      我通过让我的视图用户控件继承自此类而不是 ViewUserControl<T>(它是 RenderView 的一种补丁)来解决此问题。它对我有用,希望它也对你有用。

      public class ViewUserControlWithoutViewState<T> : ViewUserControl<T> where T : class {
          protected override void LoadViewState(object savedState) {}
      
          protected override object SaveControlState() {
              return null;
          }
      
          protected override void LoadControlState(object savedState) {}
      
          protected override object SaveViewState() {
              return null;
          }
      
          /// <summary>
          /// extracted from System.Web.Mvc.ViewUserControl
          /// </summary>
          /// <param name="viewContext"></param>
          public override void RenderView(ViewContext viewContext) {
              viewContext.HttpContext.Response.Cache.SetExpires(DateTime.Now);
              var containerPage = new ViewUserControlContainerPage(this);
              ID = Guid.NewGuid().ToString();
              RenderViewAndRestoreContentType(containerPage, viewContext);
          }
      
          /// <summary>
          /// extracted from System.Web.Mvc.ViewUserControl
          /// </summary>
          /// <param name="containerPage"></param>
          /// <param name="viewContext"></param>
          public static void RenderViewAndRestoreContentType(ViewPage containerPage, ViewContext viewContext) {
              string contentType = viewContext.HttpContext.Response.ContentType;
              containerPage.RenderView(viewContext);
              viewContext.HttpContext.Response.ContentType = contentType;
          }
      
          /// <summary>
          /// Extracted from System.Web.Mvc.ViewUserControl+ViewUserControlContainerPage
          /// </summary>
          private sealed class ViewUserControlContainerPage : ViewPage {
              // Methods
              public ViewUserControlContainerPage(ViewUserControl userControl) {
                  Controls.Add(userControl);
                  EnableViewState = false;
              }
      
              protected override object LoadPageStateFromPersistenceMedium() {
                  return null;
              }
      
              protected override void SavePageStateToPersistenceMedium(object state) {}
          }
      }
      

      我不久前blogged about this

      【讨论】:

      【解决方案3】:

      【讨论】:

      • 关闭为“按设计”...不错的“设计”微软! :-/
      【解决方案4】:

      我还在 asp.net mvc beta 中发现了这个错误。它可以非常重现。使用默认模板创建asp.net mvc应用程序后,在设计视图的home.aspx页面中添加一个asp:button控件,按f5,主页正常显示。单击按钮,将显示此错误。调试mvc源码后发现是site.master页面的ViewUserControl引起的,把,那么点击事件就可以正常处理了。

      我还发现像 enableViewStateMac="false" enableEventValidation="false" viewStateEncryptionMode="Never" 这样的设置没有用。

      在 mvc 源代码中,以下部分处理 ViewUserControl 渲染

      public virtual void RenderView(ViewContext viewContext) {

      // TODO: Remove this hack. Without it, the browser appears to always load cached output
      viewContext.HttpContext.Response.Cache.SetExpires(DateTime.Now);
      **ViewUserControlContainerPage containerPage = new ViewUserControlContainerPage(this);**
      // Tracing requires Page IDs to be unique.
      ID = Guid.NewGuid().ToString();
      containerPage.RenderView(viewContext);
      

      }

      私有密封类 ViewUserControlContainerPage : ViewPage {

      public ViewUserControlContainerPage(ViewUserControl userControl) {
          Controls.Add(userControl);
      }
      

      }

      ViewUserControl 始终呈现在新创建的容器页面中,此页面不会选择您的设置。事实上,如果进入本节,手动将 container.enableViewStateMac 更改为 false,确实有助于消除错误。所以解决它的唯一方法是要求微软更改mvc代码。

      【讨论】:

        【解决方案5】:

        我也有同样的问题, 我有一些流氓

        <form></form>
        

        标签,一旦我将它们从我的页面中删除,错误就不再出现了。

        【讨论】:

          【解决方案6】:

          您是否将 Safari 用作浏览器?如果是这样,那么这可能是大浮动的问题。去掉那个浮子,一切都会好起来的。

          【讨论】:

          • 如果这是真的,而且仅关于 safari,最好有一个参考链接。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-24
          • 2011-12-18
          相关资源
          最近更新 更多