ASP.net MVC AntiForgeryToken по Ajax

Я создал бы класс формы динамично в функции, так, чтобы он имел доступ к филиалу через закрытие:

def make_service_form(affiliate):
    class ServiceForm(forms.Form):
        option = forms.ModelChoiceField(
                queryset=ServiceOption.objects.filter(affiliate=affiliate))
        rate = forms.DecimalField(widget=custom_widgets.SmallField())
        units = forms.IntegerField(min_value=1, 
                widget=custom_widgets.SmallField())
    return ServiceForm

В качестве награды, Вы не должны переписывать queryset в поле опции. Оборотная сторона - то, что разделение на подклассы немного броско. (Любой подкласс должен быть сделан похожим способом.)

редактирование:

В ответ на комментарий, можно вызвать эту функцию о любом месте, Вы использовали бы имя класса:

def view(request):
    affiliate = get_object_or_404(id=request.GET.get('id'))
    formset_cls = formset_factory(make_service_form(affiliate))
    formset = formset_cls(request.POST)
    ...
8
задан j82374823749 28 August 2009 в 10:05
поделиться

3 ответа

Я не знаю конкретно об AJAX ActionLink, но со страницы WebForms можно отправить сообщение в действие MVC с помощью [AcceptVerbs (HttpVerbs.Post), ValidateAntiForgeryToken] атрибуты.

Вы можете использовать отражение, чтобы получить доступ к методам MVC, используемым для установки cookie и сопоставления входных данных формы, используемых для проверки MVC.

См. Этот ответ: Использование MVC HtmlHelper из WebForm

2
ответ дан 5 December 2019 в 07:12
поделиться

Я сам не использовал никаких помощников ajax, но я не вижу причин, по которым вы не можете использовать ссылку. Лично я бы использовал обработчик события onload, чтобы ненавязчиво создать ссылку из самой формы, а затем удалить ее.

0
ответ дан 5 December 2019 в 07:12
поделиться

Посмотрите это сообщение в блоге .

Допустим, у вас есть метод Action, например это:

[AcceptVerbs (HttpVerbs.Post), ValidateAntiForgeryToken] общедоступный ActionResult DeleteAccount (int accountId) { // удаляем материал}

И вы вызываете его через:

$. post ('/ home / DeleteAccount', { accountId: 1000}, function () { alert ('Учетная запись удалена.'); });

Поскольку POST не включает AntiForgeryToken, он не сработает.

К счастью, это не займет много времени умственные силы, чтобы исправить это. Все клиент побочный компонент AntiForgeryToken действительно помещает токен в базовый скрытое поле. Итак, вам просто нужно вытащите эти данные и включите их в ваш вызов AJAX.

var token = $ ('input [name = __ RequestVerificationToken]'). val ();

$. post ('/ home / DeleteAccount', { accountId: 1000, '__RequestVerificationToken': токен}, function () { alert ('Учетная запись удалена.'); });

Обратите внимание, что если у вас несколько формы на странице с несколькими AntiForgeryTokens, вам нужно будет укажите, какой из них вы хотите в своем Селектор jQuery. Еще одна проблема, если вы используете jQuery serializeArray () , у вас будет чтобы добавить немного иначе:

var formData = $ ('# myForm'). serializeArray (); вар токен = $ ('input [имя = __ RequestVerificationToken]'). val (); formData.push ({имя: '__RequestVerificationToken', значение: токен});

$. post ('/ home / DeleteAccount', formData, function () { alert ('Учетная запись удалена.'); });

Обновление: исправлена ​​ссылка.

9
ответ дан 5 December 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: