__RequestVerificationToken axios 0.17.1 和 MVC 3/4/5 未正确发送

__RequestVerificationToken not sent correctly with axios 0.17.1 and MVC 3/4/5

我从项目中删除了 jQuery 以支持 axios,但是当我尝试验证 __RequestVerificationToken 时,控制器响应:

The required anti-forgery form field "__RequestVerificationToken" is not present

我看到数据以 json 格式发送,并以 jquery 作为表单数据。

Controller 是否有任何方法可以检测 json 格式,或者我是否需要在发送之前序列化数据?

axios({
      url: '/api/controller/method',
      data: {
        __RequestVerificationToken,
        otherData
      },
      method: 'post'
    })

我们为 axios 添加了一个配置文件,并添加了一个插件 "qs" 来对查询进行字符串化。

import qs from 'qs'
import axios from 'axios'
import fd from '../FormDataBuilder'

axios.defaults.headers['X-Requested-With'] = 'XMLHttpRequest'
axios.defaults.paramsSerializer = p => qs.stringify(p, { allowDots: true })
axios.defaults.transformRequest = [d => typeof d === 'object' ? d.formdata ? fd(d) : qs.stringify(d, { allowDots: true }) : d]

export default axios

FormDataBuilder 是针对 "formdata" 表单的函数。

现在服务器正确接收令牌。

qs 添加到您的项目 (npm install qs --save)

在您的 .chtml 中:

<div id="token">@Html.AntiForgeryToken()</div>

在你的组件中 vue.js :

开头:

import qs from 'qs'
import axios from "axios"

在函数中:

let token = document.querySelector('token, input').getAttribute('value');   

axios.post( "/api/controller/method", qs.stringify({ '__RequestVerificationToken': token}));