【问题标题】:ViewStateException - Validation of viewstate MAC failed - Sitefinity ASP.NET MVC with Jquery MobileViewStateException - 验证视图状态 MAC 失败 - 带有 Jquery Mobile 的 Sitefinity ASP.NET MVC
【发布时间】:2013-12-18 20:52:03
【问题描述】:

大多数时候我在提交表单时都会收到此错误。我正在使用带有 ASP.NET MVC 4.0 和 JQuery Mobile 的 Sitefinity 6.2。

由于我在混合模式下拥有 Sitefinity,我正在使用 @Html.BeginFormSitefinity() 命令来创建表单。在控制器上,我对 [HttpPost] 属性进行了操作。代码总是毫无问题地达到我在控制器上的默认操作。无论我在提交时在表单中输入什么内容,我都只会在页面上收到一条错误消息...从不点击 HttpPost 操作。

我环顾四周,有很多页面修复了 MAC 失败问题,但没有一个对我有用。我在 web.config 中有一个机器密钥,我不会将 enableViewStateMac 设置为 false,因为这是一个安全漏洞。

【问题讨论】:

    标签: asp.net-mvc-4 jquery-mobile viewstate sitefinity


    【解决方案1】:

    好的,我尝试使用以下两种解决方案,但它们都非常糟糕。这是我现在正在做的事情,仍然不是很好,但是我在同一个页面上拥有 Sitefinity、MVC 和 JQuery Mobile,并且表单不再给我查看状态异常。

    首先,添加 data-ajax="false" 是不够的,要使其工作,您需要在 JQuery Mobile 启动之前禁用 Ajax。因此,要做到这一点,您需要在 JQuery Mobile 文件加载之前但在 JQuery 文件加载之后添加此脚本。

    $(document).bind("mobileinit", function () { $.mobile.ajaxEnabled = false; });
    

    完成此操作后,我不使用 Sitefinity Begin Form,我只是使用 JQuery 来更改主页上的表单以获得正确的操作。

    <script>
        $("#aspnetForm").attr("action", "Home/Login");
    </script>
    

    这意味着每次页面更改都会有完整的页面加载,并且表单帖子使用在我的 WebForms 母版页中声明的表单。

    -旧答案- 实际上......我下面的内容不起作用。我是什么 目前做的真的很丑,但通常可以工作。

    只要用户从主页进入网站,然后主页 page 是 Jquery Mobile 的第一页。我的视图状态错误 得到是因为它将当前页面视为第一页并且 表单提交到活动页面。如果控制器用于 主页刚刚设置为处理所有 HTTPPost 调用?我有 从所有带有表单的视图中删除了 @Html.BeginFormSitefinity() 我只是使用我的顶级母版页上的表格。然后我添加 视图上的代码更改此表单的操作以指向 主页面控制器。前

    <script>
        $("#aspnetForm").attr("action", "Home/Login");
    </script>
    

    一旦我做出这个改变,表单就不会抛出视图状态 例外...只要主页是 Jquery Mobile 的第一页。 如果用户从不同的页面进来,那么一切都会被打乱。 目前还没有答案。

    • 非常老的答案 -

    好的,我想我已经找到了。我在某处读过,现在失去了链接,一个 可能导致错误消息的问题列表。其中之一是 正在从其他页面提交表单。

    我查看了 Fiddler 收到的错误消息并注意到 推荐人是我的主页,但表单帖子的 URL 是 我的表单页面的 URL。而不是浏览我的网站 到我在地址栏中输入 URL 的表单的页面。我试过 再次提交我的表单,现在它可以工作了!

    所以,这是 Sitefinity 和 JQuery Mobile 共同解决的问题。

    当 asp.net MVC 在 Sitefinity 中以混合模式运行时,它实际上是 在包含表单的 Web.Forms 母版页中运行。当您使用 @Html.BeginFormSitefinity() 将表单添加到实际的视图中 只需添加一个 div 然后使用 AJAX 提交表单就可以了 Web.Forms 母版页。

    JQuery Mobile 会加载您访问的第一个页面,但会加载后面的页面 只是注入到现有页面中。所以,有多个 在 DOM 中加载的 data-role="page" div,在 Sitefinity 内部 Web.Forms 母版页。

    所有这些都导致表单与 active data-role="page" 但服务器看到它正在被引用 从我加载的原始页面。所以,如果我去页面 表格首先会起作用,从它没有的任何其他页面开始 工作。

    现在我知道了,我可以在链接上输入 data-ajax="false" 带有表单的页面,所有看起来都在工作。这会导致 JQuery Mobile 不会将目标页面注入当前页面,而是 将加载所有新鲜的目标。

    data-ajax="false" 就是答案!

    【讨论】:

    • 另外,请确保不要将 [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] 放在操作上。从中得到相同的视图状态异常...
    猜你喜欢
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2011-12-18
    相关资源
    最近更新 更多