所需的防伪表单字段 __requestverificationtoken 不存在 ajax 调用时出错

Posted

技术标签:

【中文标题】所需的防伪表单字段 __requestverificationtoken 不存在 ajax 调用时出错【英文标题】:the required anti-forgery form field __requestverificationtoken is not present Error while ajax call 【发布时间】:2015-08-04 08:17:00 【问题描述】:

anti-forgery form field “__RequestVerificationToken” is not present when using jQuery Ajax and the html.AntiForgeryToken()How to make ajax request with anti-forgery token in mvcAJAX Posting ValidateAntiForgeryToken without Form to MVC Action Method

以上所有答案都对我没有帮助。我在使用 Jquery Ajax 调用的请求中收到此错误:

“必填的防伪表单字段“__RequestVerificationToken”为 不存在”

如果我在 POST 操作方法中评论 [ValidateAntiForgeryToken] 属性,它工作正常。我想知道为什么我会收到这个错误。

@using (Html.BeginForm("Save", "AddPost", FormMethod.Post, new  id = "CreateForm" ))

    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>GropPost_Table</h4>
        <hr />
        @Html.ValidationSummary(true)

        <div class="form-group">
            @Html.LabelFor(model => model.Body, new  @class = "control-label col-md-2" )
            <div class="col-md-10">
                @Html.TextBoxFor(model => model.Body, new  id = "Bf" )
                @Html.ValidationMessageFor(model => model.Body)
            </div>
        </div>


        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input id="btnAdd" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
  

  [HttpPost]
        [ValidateAntiForgeryToken]
        public JsonResult Save([Bind(Include = "Body")] GropPost_Table groppost_table)
        

            if (ModelState.IsValid)
            

                groppost_table.GroupID = 1;
                groppost_table.ID = 1;
                groppost_table.PostDate = System.DateTime.Now;
                db.GropPost_Table.Add(groppost_table);
                db.SaveChanges();
                return Json(groppost_table);
            

            else
            

                return Json("we Couldent add your post");
            
        

<script type="text/javascript">

    $("#btnAdd").click(function () 

        var GropPost_Table = 
            "Body": $("#Bf").val()       
        ;

        var token = $('#CreateForm input[name=__RequestVerificationToken]').val()

        var headers = ;

        headers['__RequestVerificationToken'] = token;


        $.ajax( 
            type: "POST",
            url: "@Url.Action("Save","AddPost")",
            data: JSON.stringify(GropPost_Table),
            contentType: "application/json;charset=utf-8",
            processData: true,
            headers:headers,
            success: function (dataR) 
                $("#Bf").val('');
           ,
            error: function (dataR) 
                $("#Bf").val('');
                alert(dataR.toString());
            
        );
    );
    </script>

【问题讨论】:

您的 header 设置没有使用正确的语法 - 它应该是一个具有键/值对的对象。检查您链接的second question 中的最佳答案以获得答案。 @RoryMcCrossan 我编辑了我的代码!没有改变 !还是那个错误! 【参考方案1】:

我一直将请求验证令牌包含在 POST 的数据中,而不是标题中。我会这样处理它:

首先将type="submit" 添加到您的输入按钮,以便在单击时提交表单。然后在你的javascript中:

// Listen for the submit event on the form
$('#CreateForm').on('submit', function(event)  
    var $form = $(this);

    $.ajax(
        // Html.BeginForm puts the url in the 
        // "action" attribute
        url: $form.attr('action'),
        // Serializing the form will pick up the verification
        // token as well as other input data
        data: $form.serialize(),
        success: function(dataR) 
            $('#Bf').val('');
        ,
        error: function(dataR) 
            $('#Bf').val('');
            alert(dataR.toString());
        
    );

    // Preventing the default action will keep the form
    // from doing a full POST.
    event.preventDefault();
);

【讨论】:

以上是关于所需的防伪表单字段 __requestverificationtoken 不存在 ajax 调用时出错的主要内容,如果未能解决你的问题,请参考以下文章

所需的防伪表单字段 __requestverificationtoken 不存在 ajax 调用时出错

ajax 调用中不存在所需的防伪表单字段“__RequestVerificationToken”

从 ajax 方法调用操作引发错误:所需的防伪表单字段“__RequestVerificationToken”不存在

jmeter中的相关问题:所需的防伪形式字段“__RequestVerificationToken”不存在

所需的防伪 cookie“__RequestVerificationToken”不存在

使用 jQuery Ajax 和 Html.AntiForgeryToken() 时,防伪表单字段“__RequestVerificationToken”不存在