如何在ajax调用中调用本地MVC 4函数

时间:2013-06-09 08:49:31

标签: asp.net-mvc jquery asp.net-mvc-4 antiforgerytoken

在我的SPA网站上,我需要通过ajax将反服务令牌发送到服务器。我用这篇文章的方法:

http://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-%28csrf%29-attacks

所以在我的layout.cshtml中我有本地函数:

<script>
    @functions{
    public string TokenHeaderValue()
    {
        string cookieToken, formToken;
        AntiForgery.GetTokens(null, out cookieToken, out formToken);
        return cookieToken + ":" + formToken;                
    }
}
</script>

我有一个名为register.js的独立js文件,我在ajax中调用了这个函数:

   $.ajax({
                url: 'User/JsonRegister',
                type: "POST",
                data: d,
                headers: {
                    'RequestVerificationToken': '@TokenHeaderValue()'
                },
                success: function (result) {
                },
                error: function (result) {
                }
            });

问题是我永远不会调用@TokenHeaderValue()并且我不断收到此错误:

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

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

问题是在单独的js文件中使用服务器端帮助程序功能。如果需要在单独的js文件中调用ajax,请将@TokenHeaderValue()值设置为隐藏字段,并读取js文件中隐藏字段的值。

答案 1 :(得分:0)

我以这种方式向我的数据添加标记:它解决了问题

 AddAntiForgeryToken = function (data) {
            data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val();
            return data;
        };

答案 2 :(得分:-1)

以JSON格式传递数据

$.ajax({
     type:"POST",
     datatype:"JSON",
     data:{d:d}, // Remaining code is same

});

在控制器中使用方法签名之前使用[HttpPost],因为它是Post请求。