【问题标题】:ASP.Net MVC 5 using jQuery Ajax unable to send __RequestVerificationToken使用 jQuery Ajax 的 ASP.Net MVC 5 无法发送 __RequestVerificationToken
【发布时间】:2017-06-23 12:28:33
【问题描述】:

我正在使用带有 jQ​​uery 的 MVC 5,并且在使用 Ajax 发布防伪令牌时遇到了困难。我已经在各种修复中查看了 SO,但似乎没有任何效果。

我的视图中有以下代码。

@using (Html.BeginForm("None", "None", FormMethod.Post, new { @id = "js-form" }))
{
    @Html.AntiForgeryToken()
    ....
    other code  
    ....
    <button class="button-primary button expand js-button-search" type="button">Search</button>
}

然后使用 jQuery,我通过类:js-button-search 选择元素,为上面的按钮添加了一个事件处理程序。主要的 Ajax 调用如下所示

$.ajax({
        url: url,
        method: 'POST',
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify(_self.JsonData),
        success: function (result) {
            // Success code
        },
        error: function (jqXHR, textStatus, errorThrown) {
            // Failure code
        }
    });

我的困惑在于数据参数。我有一个按需填充的对象,其中包含大量可用于搜索的元素。

对象采用以下形式(由于我们目前有 40 多个搜索字段而缩短):

_self.JsonData = { "searchData": {"DocIdFrom" : "426737", "DocIdTo" : "753675", "DocIdTypeSearch" : "between", "DocDateFrom" : "06/02/2017", "DocDateTo" : "", "DocDateTypeSearch" : "greater than", .....
       etc...  
}}

如您所见,数据是使用 JSON.stringify 解析的。只要在控制器函数上注释掉 [ValidateAntiForgeryToken] 属性,所有这些工作即可。

控制器如下:

[HttpPost]
//[ValidateAntiForgeryToken]
public JsonResult GetSearchResultsJson(SearchCriteria searchCriteria, int? page) 
{
    // code in here
}

当我取消注释防伪属性时,页面停止工作。

现在我知道需要将令牌与帖子一起传递,并尝试了以下操作但没有成功:

how-can-i-supply-an-antiforgerytoken-when-posting-json-data-using-ajax asp-net-mvc-5-ajax-request-on-edit-page-error-requestverificationtoken-is-not

我所拥有的似乎是一个复杂对象之间的主要区别,但我认为这是一个红鲱鱼,因为 Stringify 将对象转换为字符串。

抱歉,忘记添加了。启用 [ValidateAntiForgeryToken] 时,Fiddler 返回以下消息

[Fiddler] ReadResponse() failed: The server did not return a complete response for this request. Server returned 0 bytes. 

【问题讨论】:

  • 仍在努力。我在 ajax 调用的标头中添加了令牌,Chrome 报告了以下消息:“Unexpected token
  • 我无法添加任何格式的代码,这里是它的基础:get_searchInputs: function () { this.JsonData = { "searchData": { "docIdFrom": docSearch.elem.inputs. txtDocIdFrom.val(), "docIdTo": docSearch.elem.inputs.txtDocIdTo.val(), "ticketSearchTextTo": docSearch.elem.inputs.searchTextTo.val(), 等等......
  • 现在我尝试了以下仍然没有成功。 weblogs.asp.net/dixin/…
  • 为什么要对数据进行字符串化?只需在您的对象中添加令牌 - var data = { DocIdFrom : '426737, DocIdTo : '753675', ..... ,__RequestVerificationToken: $('[name=__RequestVerificationToken]').val() } 并使用 data: data, 并删除 contentType 选项。

标签: javascript jquery asp.net ajax asp.net-mvc


【解决方案1】:

我要感谢 Stephen Muecke 提供了该问题的解决方案。

首先我的 Json 对象被转换为以下内容:

var data = { "__RequestVerificationToken":$('[name=__RequestVerificationToken]').val(),
             "searchData":
             {
                 "DocIdFrom" : "426737", 
                 "DocIdTo" : "753675",
                 ..............
                 etc
             }
           }

然后,我从 Ajax 调用中删除了 contentType 参数,并停止对 Json 数据进行刺痛。

这已经达到了预期的效果,现在我可以使用 [ValidateAntiForgeryToken] 属性调用 MVC 控制器。

【讨论】:

    【解决方案2】:

    您可以使用以下方法之一在 Ajax 调用中传递 RequestVerificationToken (AntiForgeryToken):

    方法一: 使用serialize()或FormData()方法时,不需要单独给数据参数加上token(会包含id formdata 参数):

    //Send the values of all form controls within the <form> tags including the token:
    var formdata = $('#frmCreate').serialize();
    //or
    var formdata = new FormData($('#frmCreate').get(0));
    


    方法二:

    var token = $('[name=__RequestVerificationToken]').val();
    $.post(url, { comment: comment, IssueID: postId, __RequestVerificationToken: token }, 
        function (data) { … })
    

    那么就可以使用如下图的Controller了:

    [HttpPost] 
    [ValidateAntiForgeryToken]
    public JsonResult AddComment(string comment, int IssueID){
        //...
    }
    

    希望这会有所帮助...

    【讨论】:

      猜你喜欢
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      • 2018-12-09
      • 1970-01-01
      • 2018-10-03
      • 2016-03-28
      相关资源
      最近更新 更多