【发布时间】:2022-02-22 16:27:05
【问题描述】:
我有一个使用谷歌时间线图表的 asp.net 核心预订系统的工作项目。当您单击图表时,会弹出带有部分视图的模式弹出窗口以输入数据。 Javacript 在保存按钮上有一个单击事件以将数据发送到控制器。控制器验证数据并将部分视图发送回 javascript,然后将其发送回模式弹出窗口。我在视图上有两个标志,如果设置为 true,javascript 会隐藏弹出窗口。这一切都有效,直到我用[ValidateAntiForgeryToken]装饰控制器
我的代码如下
启动:
services.AddAntiforgery(options => {
options.HeaderName = "RequestVerificationToken";
});
Javascript:
(function() {
var PlaceHolderElement = $('#PlaceHolderHere');
//create popup save
PlaceHolderElement.on('click', '[data-save="modal"]', function(event) {
event.preventDefault();
var form = $(this).parents('.modal').find('form');
var token = $("input[name='__RequestVerificationToken']").val();
var actionUrl = form.attr('action');
var sendData = form.serialize();
$.ajax({
type: 'POST',
url: actionUrl,
data: sendData,
}).done(function(data1) {
var newBody = $('.modal-body', data1);
PlaceHolderElement.find('.modal-body').replaceWith(newBody);
var isValid = newBody.find('[name="IsValid"]').val() === 'True';
var isValid2 = newBody.find('[name="BookingFree"]').val() === 'True';
if (isValid && isValid2) {
PlaceHolderElement.find('.modal').modal('hide');
location.reload();
}
})
})
控制器:
[HttpPost]
public IActionResult EditBooking(BookingViewModel model) {
if (ModelState.IsValid) {
... other code
}
}
当我用 [ValidateAntiForgeryToken] 装饰控制器并将 jarvascript 更改为
data: {
model: sendData,
__RequestVerificationToken: token,
}
验证有效,但模型为空!如果我将模型声明为字符串,那么我会得到一个字符串。
如果我在 headers: 中发送令牌,则令牌验证失败
我需要模型中的数据才能让 ModelState 设置 IsValid
【问题讨论】:
-
您好,
.serialize()默认将表单数据与 __RequestVerificationToken 值一起传递。 Startup.cs 中的AddAntiforgery也没用。你能分享你的html代码吗? -
谢谢,我已经从 StartUp.cs 中删除了 AddAntiforgery 并将 @Html.AntiForgeryToken() 添加到我的视图页面,它现在可以工作了。以前试过这个,但失败了。再次感谢您
-
我在下面分享了一个答案。请检查。
标签: javascript asp.net ajax asp.net-core antiforgerytoken