LMK*_*MKN 5 ajax post asp.net-core
我正在基于ASP.NET Core构建ASP.NET Zero。当我在其中一个页面上使用KendoUI Upload控件时,出现了严重的请求错误。经过大量研究和调查,我意识到HTTP POST Ajax请求失败,并出现400错误的请求错误。下面的代码示例在我测试的其他场景中有一些注释行。堆栈溢出中的现有帖子均未解决我的问题。我下面是我的ajax电话:
$.ajax({
url: "/test/TestCall",
type: 'Post',
/* data: JSON.stringify({ "Param1": "test" }),
dataType:"json",
processData: false, */// tell jQuery not to process the data
contentType: "application/json", // tell jQuery not to set contentType
success: function (result) {
var res = result;
},
error: function (jqXHR) {
var z = 3;
},
complete: function (jqXHR, status) {
var x = 10;
}
});
Run Code Online (Sandbox Code Playgroud)
我的Controller代码是:我也尝试不从MyTestProjectControllerBase扩展而仅使用Controller基类。这没用。
public class TestController : MyTestProjectControllerBase
{
public IActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult TestCall()
{
//return Content("Name is:" );
return new ContentResult() { Content = "test" };
}
}
Run Code Online (Sandbox Code Playgroud)
我想念什么?我尝试使用邮递员,但看到此附加信息“由于语法错误而无法满足请求”
在此问题上花费了8个小时之后,仍无法解决。不确定问题出在Asp.net核心还是asp.net零。任何指针将不胜感激。
在通过shyju检查注释之后进行更新:Startup.cs文件包含以下代码,该代码启用AntiForgeryTokenAttribute
services.AddMvc(options =>
{
options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
Run Code Online (Sandbox Code Playgroud)
根据shyju的回答更新ajax调用和视图:
$("#backBtn").on("click", function (e) {
var t = $("input[name='__RequestVerificationToken']").val();
$.ajax({
url: "/test/TestCall",
type: 'Post',
/* data: JSON.stringify({ "Param1": "test" }),
dataType:"json",
processData: false, */
contentType: "application/json",
headers: {
"RequestVerificationToken": t
},
success: function (result) {
var res = result;
},
error: function (jqXHR) {
var z = 3;
},
complete: function (jqXHR, status) {
var x = 10;
}
});
});
Run Code Online (Sandbox Code Playgroud)
我的视图现在看起来像这样:删除了html的其余部分
<div id="container">
@Html.AntiForgeryToken()
<div class="k-edit-field label">Vendor Name</div>
</div
Run Code Online (Sandbox Code Playgroud)
Shy*_*yju 13
看起来您已AutoValidateAntiforgeryTokenAttribute
全局应用过滤器。这意味着当调用 HTTP Post 操作方法时(正常或 ajax),框架将检查提交的请求数据,如果没有找到有效的防伪令牌(RequestVerificationToken
标头),它将被视为错误请求和 400 响应将被送回。
要解决此问题,您可以显式读取__RequestVerificationToken
隐藏输入的值(由表单标签助手生成)并将其发送到您的 ajax 请求标头中。
var t = $("input[name='__RequestVerificationToken']").val();
$.ajax({
url: "/test/TestCall",
type: 'Post',
headers:
{
"RequestVerificationToken": t
},
success: function (result) {
alert("Success");
var res = result;
},
error: function (jqXHR) {
var z = 3;
},
complete: function (jqXHR, status) {
var x = 10;
}
});
Run Code Online (Sandbox Code Playgroud)
您可以通过将IAntiforgery
实现注入视图/页面并使用该GetAndStoreTokens
方法来使代码更加健壮。
将此添加到您的视图中
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
@functions{
public string GetAntiXsrfRequestToken()
{
return Xsrf.GetAndStoreTokens(Context).RequestToken;
}
}
Run Code Online (Sandbox Code Playgroud)
并调用此 GetAntiXsrfRequestToken 函数以获取 javascript 中的值(在视图文件中)
headers:
{
"RequestVerificationToken": '@GetAntiXsrfRequestToken()'
},
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2438 次 |
最近记录: |