所需的防伪表单字段"__RequestVerificationToken"不存在

Bil*_*med 4 ajax jquery antiforgerytoken asp.net-mvc-5

这是我的另一个障碍,我希望我的网站保持跨站点攻击,我正在通过使用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);
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

现在,它没有像ajax请求那样导航到Sales Controller中的Create操作,在此之前,它会抛出以下异常:

所需的防伪表单字段"__RequestVerificationToken"不存在.

我在谷歌搜索了很多但仍然不成功,这就是为什么我在这里,我读过一些博客,说使用jquery获取隐藏的__RequestVerificationToken字段并将其附加到表单值,包含JSON.stringify(salesmain)在一个函数中,这样:

$.ajax({
.
.
addRequestVerificationToken(JSON.stringify(salesmain))
Run Code Online (Sandbox Code Playgroud)

和功能:

function addRequestVerificationToken(data) {
data.__RequestVerificationToken = $('input[name=__RequestVerificationToken]').val();
return data;
};
Run Code Online (Sandbox Code Playgroud)

另外,我已经有了以下代码结构:

@using (Html.BeginForm())
{
  @Html.AntiForgeryToken()
  .
  .
Run Code Online (Sandbox Code Playgroud)

和Create操作之前的属性:

[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult Create([Bind(Include = "SalesId,ReferenceNo,SalesDate,SalesPerson")] SalesMain salesMain)
{
.
.
Run Code Online (Sandbox Code Playgroud)

而且我也在使用jQuery 1.5,可能是它的罪魁祸首,如果不是那么我应该怎么做才能解决这个问题?任何帮助将深表感谢,在此先感谢:)

小智 10

您的addRequestVerificationToken()函数不会添加令牌,因为您已经对数据进行了字符串化(它不再是javascript对象,因此data.__RequestVerificationToken = $(...)不执行任何操作).

您可以通过将代码更改为来完成此工作

data: JSON.stringify(addRequestVerificationToken(salesmain)),
Run Code Online (Sandbox Code Playgroud)

但是这是不必要的,因为您不需要对数据进行字符串化.而是删除该contentType: 'application/json;',选项,以便它使用默认值application/x-www-form-urlencoded; charset=UTF-8'并使用

data: addRequestVerificationToken(salesmain),
Run Code Online (Sandbox Code Playgroud)

或者更好的是,如果你有正确生成,您可以查看使用HtmlHelper方法和你的输入包含正确的名称属性(name="SalesId",name="ReferenceNo"等),然后你一个简单的使用

data: $('form').serialize(),`
Run Code Online (Sandbox Code Playgroud)

这将正确序列化您表单中的所有输入,包括令牌.