我在.NET Core中的ajax调用中在xsr.send上收到错误400

时间:2017-12-21 04:21:43

标签: jquery .net ajax call core

确定。所以这个让我发疯,似乎可能是因为很多原因。我正在尝试使用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();" />

我结束了以下错误:

In Chrome

当您向下钻取违规行时,似乎是:

xhr.send( options.hasContent && options.data || null );

有什么想法吗?对于我的情况至少......

1 个答案:

答案 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()