【问题标题】:MVC 3 AJAX and [ValidateAntiForgeryToken]MVC 3 AJAX 和 [ValidateAntiForgeryToken]
【发布时间】:2011-09-01 20:52:10
【问题描述】:

previously asked a question regarding this,得到了一个interesting answer,这让我在路上,很好地问了更多问题。因此,这是我了解 AJAX 帖子的内部工作原理以及相当烦人的 ValidateAntiForgeryTokenAttribute 的旅程中的下一个问题。

我有一个 _layout.cshtml,这是目前所有脚本文件所在的位置。我有一个登录页面,它呈现三个部分,一个用于 OpenID 登录,这只是一个普通的@using(Html.BeginForm()) {},一个用于本地登录,另一个用于基本注册。登录部分和注册部分都使用 ViewModels 和 Ajax.BeginForm

请注意,我正在使用 @using Ajax.BeginForm 并获取 data-ajax-update attr 以在成功时更新元素

_layout.cshtml 中的脚本:

$(document).ready(function () {
    $('input[type=submit]').live("click", function (event) {
        event.preventDefault();
        var _allFormData = $(this).parents().find('form');
        var _currentForm = $(this).closest('form');
        var _updateElement = $(_currentForm).attr("data-ajax-update");

        $.ajax({
            type: "POST",
            url: $(_currentForm).attr('action'),
            data: $(_allFormData).serialize(),
            success: function (data) {
                $(_updateElement).html(data);
            }
        });

        return true;
    });
});

_layout.cshtml 中的表单元素

<form id="__AjaxAntiForgeryForm" action="#" method="post">
    <@Html.AntiForgeryToken()>
</form>  

控制器中的动作方法:

public ActionResult RegisterMember(
    RegisterMemberViewModel registerMemberViewModel)
{
    // Process some stuff
    return PartialView("_Register");
}

为什么这有效,神奇的是AntiForgeryToken 被包含在我的所有帖子中。我没有抓住它并附加它,我没有用它做任何事情,它真的就在那里。有人可以解释一下为什么会这样。我不喜欢意外的解决方案,它们通常会在以后中断。

【问题讨论】:

  • @casper,感谢我上一篇文章中的相关链接太酷了。
  • 我喜欢问“为什么这样有效”的问题,因为这样我就不必挖掘答案来找到有效的代码!为您提供所有代码的道具

标签: jquery asp.net-mvc-3 antiforgerytoken


【解决方案1】:

@Html.AntiForgeryToken() 在您的表单中创建一个&lt;input type='hidden' name='__RequestVerificationToken'/&gt; 或类似的东西。如果我理解正确的话:var _allFormData = $(this).parents().find('form'); 结合这个:data: $(_allFormData).serialize() 将所有表单数据发布到服务器,包括 MVC 可能寻找的输入字段 __RequestVerificationToken

【讨论】:

  • 嗯,很有趣。我想知道登录表单中的表单数据是否每次都被发送。
  • 可能,因为$(this).parents().find('form') 将返回在 dom 文档中找到的所有表单元素。
  • 是的,每个表单的值都在发送,所以现在我需要想办法过滤掉其他表单,只包括当前表单和防伪表单。但是,您确实回答了我的问题,如果我无法弄清楚过滤部分,我相信我会发布另一个问题。不过要试一试。非常感谢您的回答。
  • 您可能可以在 .find() 中应用其他 jquery 选择器来识别这两种形式
  • 我打破了验证,但令牌有效 :) 我发布了另一个问题 stackoverflow.com/questions/7272232/…
猜你喜欢
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 2012-09-22
  • 2019-01-26
  • 2016-08-06
  • 1970-01-01
相关资源
最近更新 更多