簡體   English   中英

使用jQuery Ajax的ASP.Net MVC 5無法發送__RequestVerificationToken

[英]ASP.Net MVC 5 using jQuery Ajax unable to send __RequestVerificationToken

我將MVC 5與jQuery一起使用,並且在使用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
        }
    });

我困惑的地方是data參數。 我有一個按需填充的對象,其中包含大量可用於搜索的元素。

對象的形式為(縮短了,因為我們當前有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
}

當我取消注釋防偽屬性時,頁面將停止工作。

現在我知道需要在發布時傳遞令牌,並嘗試了以下操作,但均未成功:

當使用ajax發布json數據時,我如何提供一個防偽令牌 asp-net-mvc-5-ajax請求在編輯頁面錯誤請求驗證令牌上沒有

我之間的主要區別似乎是一個復雜的對象,但我認為這是一個紅色鯡魚,因為Stringify將對象轉換為字符串。

抱歉,忘記添加。 啟用[ValidateAntiForgeryToken]時,提琴手將返回以下消息

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

我要感謝Stephen Muecke為該問題提供解決方案。

首先,我的Json對象被轉換為以下內容:

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

然后,我從Ajax調用中刪除了contentType參數,並停止了對Json數據的聲明。

這已經產生了預期的效果,現在我可以使用[ValidateAntiForgeryToken]屬性調用MVC控制器。

您可以使用以下方法之一在Ajax調用中傳遞RequestVerificationToken(AntiForgeryToken):

方法I:使用serialize()或FormData()方法時,不必將令牌單獨添加到數據參數中(它將包含在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) { … })

然后,您可以使用控制器,如下所示:

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

希望這可以幫助...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM