所需的防伪表单域“__RequestVerificationToken”不存在
The required anti-forgery form field "__RequestVerificationToken" is not present
这对我来说是另一个障碍,我希望我的站点保持跨站点攻击保护,我正在使用 asp.net mvc 5 到 Ajax 开发一个 Master/Detail 表单请求,因此,为了创建一个条目,我必须通过 Ajax 请求的过程,这样:
$.ajax({
url: '/Sales/Create',
data: JSON.stringify(salesmain),
type: 'POST',
contentType: 'application/json;',
dataType: 'json',
success: function (result) {
if (result.Success == "1") {
window.location.href = "/Sales/index";
}
else {
alert(result.ex);
}
}
});
现在,它没有导航到 Sales Controller 中的 Create 操作,正如 ajax 请求所说,在此之前,它抛出以下异常:
The required anti-forgery form field "__RequestVerificationToken" is not present.
我在 google 上搜索了很多但仍然没有成功,这就是我在这里的原因,我读过一些博客说使用 [=39= 获取隐藏的 __RequestVerificationToken 字段] 并将其附加到表单值,将 JSON.stringify(salesmain) 包含在一个函数中,这样:
$.ajax({
.
.
addRequestVerificationToken(JSON.stringify(salesmain))
和函数:
function addRequestVerificationToken(data) {
data.__RequestVerificationToken = $('input[name=__RequestVerificationToken]').val();
return data;
};
另外,我已经有了以下代码结构:
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
.
.
和创建操作之前的属性:
[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult Create([Bind(Include = "SalesId,ReferenceNo,SalesDate,SalesPerson")] SalesMain salesMain)
{
.
.
而且我正在使用 jQuery 1.5,可能是罪魁祸首,如果不是,那么我应该怎么做才能解决这个问题?任何帮助将不胜感激,提前致谢:)
您的 addRequestVerificationToken()
函数不会添加标记,因为您已经将数据字符串化(它不再是 javascript 对象,因此 data.__RequestVerificationToken = $(...)
什么都不做)。
您可以通过将代码更改为
来完成这项工作
data: JSON.stringify(addRequestVerificationToken(salesmain)),
然而,这是不必要的,因为您不需要对数据进行字符串化。而是删除 contentType: 'application/json;',
选项,以便它使用默认的 application/x-www-form-urlencoded; charset=UTF-8'
并使用
data: addRequestVerificationToken(salesmain),
或者更好的是,如果您使用 HtmlHelper
方法正确生成了视图并且您的输入包含正确的名称属性(name="SalesId"
、name="ReferenceNo"
等),那么您只需使用
data: $('form').serialize(),`
这将正确序列化您表单中的所有输入,包括令牌。
这对我来说是另一个障碍,我希望我的站点保持跨站点攻击保护,我正在使用 asp.net mvc 5 到 Ajax 开发一个 Master/Detail 表单请求,因此,为了创建一个条目,我必须通过 Ajax 请求的过程,这样:
$.ajax({
url: '/Sales/Create',
data: JSON.stringify(salesmain),
type: 'POST',
contentType: 'application/json;',
dataType: 'json',
success: function (result) {
if (result.Success == "1") {
window.location.href = "/Sales/index";
}
else {
alert(result.ex);
}
}
});
现在,它没有导航到 Sales Controller 中的 Create 操作,正如 ajax 请求所说,在此之前,它抛出以下异常:
The required anti-forgery form field "__RequestVerificationToken" is not present.
我在 google 上搜索了很多但仍然没有成功,这就是我在这里的原因,我读过一些博客说使用 [=39= 获取隐藏的 __RequestVerificationToken 字段] 并将其附加到表单值,将 JSON.stringify(salesmain) 包含在一个函数中,这样:
$.ajax({
.
.
addRequestVerificationToken(JSON.stringify(salesmain))
和函数:
function addRequestVerificationToken(data) {
data.__RequestVerificationToken = $('input[name=__RequestVerificationToken]').val();
return data;
};
另外,我已经有了以下代码结构:
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
.
.
和创建操作之前的属性:
[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult Create([Bind(Include = "SalesId,ReferenceNo,SalesDate,SalesPerson")] SalesMain salesMain)
{
.
.
而且我正在使用 jQuery 1.5,可能是罪魁祸首,如果不是,那么我应该怎么做才能解决这个问题?任何帮助将不胜感激,提前致谢:)
您的 addRequestVerificationToken()
函数不会添加标记,因为您已经将数据字符串化(它不再是 javascript 对象,因此 data.__RequestVerificationToken = $(...)
什么都不做)。
您可以通过将代码更改为
来完成这项工作data: JSON.stringify(addRequestVerificationToken(salesmain)),
然而,这是不必要的,因为您不需要对数据进行字符串化。而是删除 contentType: 'application/json;',
选项,以便它使用默认的 application/x-www-form-urlencoded; charset=UTF-8'
并使用
data: addRequestVerificationToken(salesmain),
或者更好的是,如果您使用 HtmlHelper
方法正确生成了视图并且您的输入包含正确的名称属性(name="SalesId"
、name="ReferenceNo"
等),那么您只需使用
data: $('form').serialize(),`
这将正确序列化您表单中的所有输入,包括令牌。