Проверка на стороне клиента ASP.NET MVC 3 RC 2 с глобализацией

Моя цель - проверить ввод пользователя на стороне клиента, в зависимости от культуры пользователей.

У меня есть примитивная модель данных со следующей структурой:

public class User
{
 public int UserId { get; set; }

 [Required]
 [StringLength(20,MinimumLength=3)]
 public string Name { get; set; }

 [Required]
 public double Height { get; set; }
}

Кроме того, я хочу, чтобы проверка на стороне клиента была включена, проверяя, является ли это допустимым числом. Поэтому я добавил следующие строки в разделе <head> моего _Layout.cshtml.

<script src="@Url.Content("~/Scripts/jQuery-1.4.2.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

Так как я хочу иметь возможность проверять ввод в форматах другого языка (в этом конкретном контексте это немецкий с форматом десятичного числа 0,75, тогда как в США это будет 0.75), я добавил следующие строки (jQuery Plugin для глобализации) ПОСЛЕ вышеупомянутых jquery.validate.min.js и jquery.validate.unobtrusive.min.js.

<script src="@Url.Content("~/Scripts/jquery.glob.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/globinfo/jquery.glob.de-de.js")" type="text/javascript"></script>
<script type="text/javascript">
 $(document).ready(function () {
  $.culture = jQuery.cultures['de-DE'];
  $.preferCulture($.culture.name);
 });
</script>

Кроме того, я добавил следующую строку в web.config в разделе system.web, чтобы убедиться, что культура всегда выбрана:

<globalization culture="de-DE" uiCulture="de-DE" />

Теперь я испытываю следующее поведение:

  • Если я наберу 0,1 (обратите внимание на немецкое "правописание" ) в текстовом поле для значения "Высота", появится сообщение об ошибке проверки The field Height must be a number, и я не могу отправить форму.
  • Если я наберу 0.1 (английское "правописание" ), я могу отправить форму, но проверка на стороне сервера возвращает следующее сообщение об ошибке проверки The value '0.1' is not valid for Height.

Итак, теперь я нахожусь в каком-то мертвом замке, где я не могу выбраться.

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

Любая помощь очень ценится! Заранее благодарю вас!

Ответ 1

К сожалению, существует конфликт имен между функциями jQuery.validate.format и jQuery.Globalization.format. Поэтому вам придется изменить свой код, чтобы использовать плагин глобализации без jquery.

Я только что написал сообщение в блоге об этом здесь.

Для вас это должно выглядеть так:

<script src="@Url.Content("~/Scripts/globalization.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/globinfo/Globalization.de-DE.js")" type="text/javascript"></script>
<script type="text/javascript">
$.validator.methods.number = function (value, element) {
    if (!isNaN(Globalization.parseFloat(value))) {
        return true;
    }
    return false;
}
$(document).ready(function () {
    $.culture = jQuery.cultures['de-DE'];
    $.preferCulture($.culture.name);
    Globalization.preferCulture($.culture.name);
});
</script>

Этого должно быть достаточно.

Ответ 2

Мне пришлось отключить UnobtrusiveJavaScript. Страница не реагирует мгновенно, но, по крайней мере, она работает.

Вы можете отключить по умолчанию в Web.Config.

<appSettings>
    <add key="enableSimpleMembership" value="false"/>
    <add key="ClientValidationEnabled" value="true"/>
    <add key="UnobtrusiveJavaScriptEnabled" value="false"/>
 </appSettings>

И я использую сценарии Microsoft для проверки:

MicrosoftAjax.js
MicrosoftMvcAjax.js
MicrosoftMvcValidation.js

А также jquery-1.4.4.min.js и jquery.glob, но я думаю, что я использую их внутренне. Проверка выполняется с помощью сценариев MS.