Asp.net core mvc 使用jquery上传图像

Asp.net core mvc 使用jquery上传图像,asp.net-core-mvc,Asp.net Core Mvc,我试图使用AJAX从局部视图上传一个图像文件,但它返回了一个错误请求(400)。我已经搜索了这么多答案,但它不起作用。这是我的剧本: $("#prodImgUpload").change(function() { var formData = new FormData(); formData.append("file", $("#prodImgUpload")[0].files[0]); console.log(formData.get("fil

我试图使用AJAX从局部视图上传一个图像文件,但它返回了一个错误请求(400)。我已经搜索了这么多答案,但它不起作用。这是我的剧本:

$("#prodImgUpload").change(function() {
        var formData = new FormData();
        formData.append("file", $("#prodImgUpload")[0].files[0]);

        console.log(formData.get("file"));
        addAntiForgeryToken(formData);

        $.ajax({
            type: "POST",
            url: "@Url.Action("UploadImage","Product",new{area="admin"})",
            data: formData,
            processData: false,
            contentType: false,
            cache: false,
            async: false,
            success: function(result) {
                alert("Image uploaded successfully");
            },
            error: function(jqXHR, textStatus, errorMessage) {
                alert(errorMessage);
            }
        });
以下是HTML:

<div class="upload-button">
<div class="label">Upload image</div>
<input asp-for="FileToUpload" id="prodImgUpload" name="FileToUpload" 
type="file" accept="image/jpeg, image/png, image/jpg, image/bmp" />
</div>

您没有在AJAX请求中包含antiforgery令牌。有关如何使用antiforgery令牌处理AJAX请求的参考。基本上,您需要向AJAX请求添加一个头:

$.ajax({
    ...
    headers: {
        "RequestVerificationToken": $('#RequestVerificationToken').val()
    },
该值来自通过以下方式添加的隐藏输入:

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
@functions{
    public string GetAntiXsrfRequestToken()
    {
        return Xsrf.GetAndStoreTokens(Context).RequestToken;
    }
}

<input type="hidden" id="RequestVerificationToken" 
   name="RequestVerificationToken" value="@GetAntiXsrfRequestToken()">
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
@功能{
公共字符串GetAntiXsrfRequestToken()
{
返回Xsrf.GetAndStoreTokens(Context.RequestToken);
}
}

它在局部视图中的事实毫无意义。JS在服务器呈现所有视图并返回完整格式的响应之后很久才运行客户端。如果你得到了400分,那么至少从你的行为角度来看,你所发布的内容有问题。发布你的行动。@Chris Pratt我已经包括了行动。请看一看。谢谢克里斯,你救了我一天,并为我提供了有用的信息,因为我是asp.net核心的新手。
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
@functions{
    public string GetAntiXsrfRequestToken()
    {
        return Xsrf.GetAndStoreTokens(Context).RequestToken;
    }
}

<input type="hidden" id="RequestVerificationToken" 
   name="RequestVerificationToken" value="@GetAntiXsrfRequestToken()">