确定。所以这个让我发疯,似乎可能是因为很多原因。我正在尝试使用JQuery 2.2在.NET核心2.0中使用实体框架在Ajax调用中收到错误400。
我的控制器方法如下所示:
[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult RetrieveDateCollections(string CollectionDate)
{
ViewData["CollectionTypeId"] = new SelectList(_context.Set<CollectionType>(), "CollectionTypeId", "CollectionTypeDescription");
ViewData["MemberId"] = new SelectList(_context.Member, "MemberId", "FullName");
var sPCC_Context = _context.Collection.Include(c => c.CollectionType).Include(c => c.Member);
return Json(sPCC_Context.ToListAsync());
}
我的JavaScript跟随:
function RetrieveDateCollections() {
var collectionDate = $('#CollectionDate').val().toString();
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "/Collections/RetrieveDateCollections",
timeout: 40000,
data: JSON.stringify({ "CollectionDate": "12/10/2018" }),
dataType: "json",
done: function (data) {
alert("Success: " + response.toString());
},
fail: function (Result) {
alert("Error: " + Result.statusCode);
}
});
}
我从我的观点中这样称呼它:
<input type="date" asp-for="CollectionDate" class="form-control" onblur="RetrieveDateCollections();" />
我结束了以下错误:
当您向下钻取违规行时,似乎是:
xhr.send( options.hasContent && options.data || null );
有什么想法吗?对于我的情况至少......
答案 0 :(得分:0)
您的代码无法验证防伪令牌(因为您没有发送它)。
要么删除控制器中的[ValidateAntiForgeryToken]
标记,要么添加一种方法来检索javascript中的防伪标记并发布它。最简单的方法是以这种方式修改JS:
function RetrieveDateCollections() {
var collectionDate = $('#CollectionDate').val().toString();
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "/Collections/RetrieveDateCollections",
timeout: 40000,
headers: { "RequestVerificationToken": getAntiforgeryToken() },
data: JSON.stringify({ "CollectionDate": "12/10/2018" }),
dataType: "json",
done: function (data) {
alert("Success: " + response.toString());
},
fail: function (Result) {
alert("Error: " + Result.statusCode);
}
});
}
function getAntiforgeryToken() {
// get the token from the form and return it
var token = $('input[name="__RequestVerificationToken"]').val();
return token;
}
为此,您需要在视图中包含防伪标记,如下所示:
@Html.AntiForgeryToken()