在ajax中使用AntiForgeryToken - mvc5

时间:2018-01-18 22:43:19

标签: javascript ajax asp.net-mvc http antiforgerytoken

我如何解决这个问题:

The required anti-forgery form field "__RequestVerificationToken" is not present.

我已阅读了很多论坛,但无法找到解决方案。似乎AntiForgeryToken没有发送,但我不知道我怎么能这样做。

在我看来,我已包含@Html.AntiForgeryToken(),我的控制器已[ValidateAntiForgeryToken]

 var http = new XMLHttpRequest();
        var url = "..@actionInAPP"
        var token = $('input[name="__RequestVerificationToken"]').val();
        var params =serialize(document.forms[@numForm]);
        console.log(params);

        http.open("POST", url, true);

           var form_data = new FormData(document.forms[@numForm]);
           return $.ajax({
             type: 'POST',
             url: url,
             contentType: false,
             processData: false,
             headers: { '__RequestVerificationToken': token },
             complete: function(){
                http.onreadystatechange = function () {
                     if (http.readyState == 4 && http.status == 200) {
                        window.location.reload();
                     }
                     if (http.readyState == 4 && http.status == 400) {
                        document.getElementById("@targetId").innerHTML = http.responseText;
                     }
                 }
                http.send(params);
            },
          });

信息保存在DB中,但在我的浏览器中我有500个错误 POST http://localhost:xxxx/xyz/Create 500(内部服务器错误)

这里有什么问题?

2 个答案:

答案 0 :(得分:1)

您可以将__RequestVerificationToken放在jquery $ajax.data字段中 并且,将您的表单数据放在$ajax.data字段中,然后您的Controller将获取表单数据。

这样的

  $.ajax({
        url: $(this).data('url'),
        type: 'POST',
        data: { 
            __RequestVerificationToken: token, 
            someValue: 'some value' 
        },
        success: function (result) {
            alert(result.someValue);
        }
    });

include antiforgerytoken in ajax post ASP.NET MVC

答案 1 :(得分:1)

我明白了! 我改变了$ ajax并且它完美无缺

return $.ajax({
             type: 'POST',
             url, url,
             contentType: false,
             processData: false,
             data: form_data,
             Success: function(){
                http.send(params);
             },
            complete: function(http){
                if (http.readyState == 4 && http.status == 200) {
                    window.location.reload();
                }
                if (http.readyState == 4 && http.status == 400) {
                    document.getElementById("@targetId").innerHTML = http.responseText;
                }
           }
        });