Механизм связывания модели ASP.NET MVC анализирует десятичные числа по-разному с запросами GET и POST - PullRequest
2 голосов
/ 01 июня 2011

На сервере размещено приложение Asp.net mvc3, и для культуры браузера установлено значение da (датский)

GET request url: /get?d=1.1  (note that the decimal separator is .)
return: da;1,1   (note that the decimal separator is ,)

GET request url: /get?d=1,1  (the decimal separator is ,)
return: Exception Details: System.ArgumentException: The parameters dictionary contains a null entry for parameter 'd' of non-nullable type 'System.Decimal' for method 'System.Web.Mvc.ContentResult get(System.Decimal)' in 'Intranet.Controllers.OrderController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. Parameter name: parameters

Но при одинаковом входном сигнале для пост-запроса результаты совершенно противоположны.

POST request url: /get2    (form data d=1.1)
return: Exception ...

POST request url: /get2    (form data d=1,1)
return: da;1,1

Я полагаю, что запрос POST работает должным образом.Но почему запрос GET ведет себя по-другому?Как работает механизм связывания модели по умолчанию в этом случае.

1 Ответ

2 голосов
/ 01 июня 2011

Когда вы отправляете данные по почте, региональные настройки вступают в силу. Когда вы отправляете данные через GET, они всегда используют инвариантную локаль.

Кажется, это сделано, потому что вы можете скопировать и вставить URL-адрес и отправить его кому-нибудь в другой стране. Если бы язык браузера учитывался при включении параметра в URL (GET), URL ломался бы (это более очевидно, если подумать о форматах даты, чем о десятичных разделителях).

Среди прочего, здесь упоминается один из членов команды .Net: http://forums.asp.net/t/1461209.aspx/1?Nullable+DateTime+Action+Parameters+Parsed+in+US+format+irrespective+of+locale+

...