Объект JavaScript / словарь должен передаваться как список пар ключ-значение для ASP.NET MVC-контроллера, когда ожидается Dictionary<TKey, TValue>
. Пример:
Если у вас есть такой словарь:
public Dictionary<string, decimal?> SomeMapping { get; set; }
, вы должны использовать что-то вроде этого в своем JavaScript:
var sourceMapping = { a: 1, b: 1.5, c: null };
var SomeMapping = [];
for (var key in sourceMapping) {
if (sourceMapping.hasOwnProperty(key)) {
SomeMapping.push({ Key: key, Value: sourceMapping[key] });
}
}
I Этот метод использовался в асинхронном запросе POST (отправленном с использованием jQuery), который имел тип контента, установленный на 'application/json'
(это может быть или не быть важным в вашем случае).
Я думаю, что ответ gruszczy является хорошим, но если вам нужна общая проверка, включающая переменные, которые, по вашему мнению, доступны только в представлении, вот альтернатива: передайте переменные в качестве аргументов в форму и разберитесь с ними в основной метод clean () формы.
Различие / преимущество здесь в том, что ваше представление остается более простым, и все вещи, связанные с содержанием формы, приемлемым, происходят в форме.
Например:
# IN YOUR VIEW
# pass request.user as a keyword argument to the form
myform = MyForm(user=request.user)
# IN YOUR forms.py
# at the top:
from myapp.foo.bar import ok_to_post # some abstracted utility you write to rate-limit posting
# and in your particular Form definition
class MyForm(forms.Form)
... your fields here ...
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user') # cache the user object you pass in
super(MyForm, self).__init__(*args, **kwargs) # and carry on to init the form
def clean(self):
# test the rate limit by passing in the cached user object
if not ok_to_post(self.user): # use your throttling utility here
raise forms.ValidationError("You cannot post more than once every x minutes")
return self.cleaned_data # never forget this! ;o)
Обратите внимание, что повышение общего значения ValidationError
в методе clean()
приведет к ошибке в myform.non_field_errors
, поэтому вам необходимо убедиться, что ваш шаблон содержит {{form.non_field_errors}}
. ] если вы вручную отображаете свою форму
Вы можете использовать сообщения в представлениях:
from django.contrib import messages
messages.error(request, "Error!")
Документация: https://docs.djangoproject.com/es/1.9/ref/contrib/messages/
Вы не используете ValidationError
в представлениях, как те исключения, что и для форм. Скорее, вам следует перенаправить пользователя на другой URL-адрес, который объяснит ему, что он не сможет опубликовать снова в ближайшее время. Это правильный способ справиться с этим. ValidationError
следует вызывать внутри экземпляра Form
, когда входные данные не проверяются. Это не тот случай.