Как вызвать локальную функцию MVC 4 внутри вызова ajax

На моем веб-сайте 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>

и у меня есть отдельный файл js с именем register.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.

Как решить эту проблему?


person Timsen    schedule 09.06.2013    source источник


Ответы (3)


Проблема заключается в использовании вспомогательной функции на стороне сервера в отдельном файле js. Если вам нужен вызов ajax в отдельном файле js, установите значение @TokenHeaderValue() в скрытое поле и прочитайте значение скрытого поля в файле js.

person Kambiz Shahim    schedule 09.06.2013

я добавляю токен к своим данным таким образом: что решает проблему

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

Передать данные в формате JSON

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

});

И используйте [HttpPost] перед подписью метода в контроллере, потому что это запрос Post.

person Fakhar uz Zaman    schedule 09.06.2013