【发布时间】:2017-06-23 12:28:33
【问题描述】:
我正在使用带有 jQuery 的 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