2013-10-08 2 views
0

Я работаю в приложении ASP.NET MVC4, и все данные массива, отправленные на сервер через ajax, должны отправляться с использованием опции traditional. (нет [] для переменных POST).

Проблема в том, что у меня также есть настройка фильтра, которая требует отправки AntiforgeryToken с каждым ajax POST.

я это исправил используя ajaxPrefilter так:

$.ajaxPrefilter(function (options, originalOptions) { 
    if (options.type.toUpperCase() == "POST") { 
    options.data = $.param($.extend(originalOptions.data, { __RequestVerificationToken: "antiForgeryToken" })); 
    } 
}); 

Это прекрасно работает, и добавляет __RequestVerificationToken ко всем должностям. Однако это также приводит к тому, что мои данные не могут быть параметризованы в соответствии с флагом traditional.

Кто-нибудь знает, как я могу изменить свой предварительный фильтр, чтобы объяснить это?

Пример можно найти здесь: http://jsbin.com/IxoKIKA/2/edit

+0

Почему вы используете токен анти-подделки для AJAX? Это совершенно бесполезно. Подтвердите, что это ajax с соответствующим заголовком. –

+0

@BenjaminGruenbaum Существует '' IFilterProvider'', который добавляет '' ValidateAntiForgeryTokenAttribute'' ко всем запросам POST, включая вызовы ajax. Наверное, я могу проверить, является ли конкретный POST вызовом XHR, а не добавлять его на основе этого. – Kippie

ответ

2

Вы забыли передать traditional аргумент $.param(). Вы должны написать:

options.data = $.param($.extend(originalOptions.data, { 
    __RequestVerificationToken: "antiForgeryToken" 
}), true); 
+0

Странно, как я пропустил этот вариант. Думаю, я был слишком зациклен на '. $ .extend''. Спасибо за помощь. – Kippie