MVC 5 - невозможно запустить глобализацию
Я хочу добавить глобализацию, потому что сайт запрашивает у пользователя дату. И мой немецкий пользователь хочет напечатать "31.12.1966", а не "1966-12-31".
Поэтому я добавляю в проект пакеты nuget "jQuery.Validation.Globalize" и "jquery-globalize".
Теперь я не могу настроить свой BundleConfig! Из своего исследования я знаю, что мне нужен globalize.js и некоторые другие файлы. Поэтому я пытаюсь сделать пакет:
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-{version}.js"));
bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
"~/Scripts/jquery.validate*"));
bundles.Add(new ScriptBundle("~/bundles/global").Include(
"~/Scripts/globalize.js",
"~/Scripts/cldr.js").IncludeDirectory("~/Scripts/cldr/",
"~/Scripts/globalize/")
);
Использование в представлении:
...
@section Scripts {
@Scripts.Render("~/bundles/global")
@Scripts.Render("~/bundles/jqueryval")
@Scripts.Render("~/bundles/unobtrusiveajax")
<script type="text/javascript">
$(function () {
$.validator.methods.date = function (value, element) {
Globalize.culture("de-DE");
// you can alternatively pass the culture to parseDate instead of
// setting the culture above, like so:
// parseDate(value, null, "en-AU")
return this.optional(element) || Globalize.parseDate(value) !== null;
}
});
</script>
}
Но я получаю ошибку:
Error at line 9, column 5 in http://localhost:58289/Scripts/jquery.validate.globalize.js
0x800a138f - runtimeerror in JavaScript:
The property "methods" of a undefindes or null-pointer can not bei called
Я перевел сообщение с этого немецкого оригинала:
Ausnahmefehler in Zeile 9, Spalte 5 in http://localhost:58289/Scripts/jquery.validate.globalize.js
0x800a138f - Laufzeitfehler in JavaScript:
Die Eigenschaft "methods" eines undefinierten oder Nullverweises kann nicht abgerufen werden.
Нужно ли больше / другие файлы в комплекте?
Что я могу сделать? Любая помощь?
С уважением, Питер
1 ответ
Я решил это так:
На мой взгляд это следующий скрипт-блок:
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="~/Scripts/cldr.js"></script>
<script src="~/Scripts/cldr/event.js"></script>
<script src="~/Scripts/cldr/supplemental.js"></script>
<script src="~/Scripts/cldr/unresolved.js"></script>
<script src="~/Scripts/globalize.js"></script>
<script src="~/Scripts/globalize/currency.js"></script>
<script src="~/Scripts/globalize/number.js"></script>
<script src="~/Scripts/globalize/date.js"></script>
<script src="~/Scripts/globalize/plural.js"></script>
<script src="~/Scripts/globalize/relative-time.js"></script>
<script src="~/Scripts/globalize/unit.js"></script>
<script src="~/Scripts/jquery.validate.globalize.js"></script>
<script>
$(document).ready(function () {
// Use $.getJSON instead of $.get if your server is not configured to return the
// right MIME type for .json files.
$.when(
$.get("/Scripts/cldr/main/de/ca-gregorian.json"),
$.get("/Scripts/cldr/main/de/numbers.json"),
$.get("/Scripts/cldr/supplemental/likelySubtags.json"),
$.get("/Scripts/cldr/supplemental/timeData.json"),
$.get("/Scripts/cldr/supplemental/weekData.json")
).then(function () {
// Normalize $.get results, we only need the JSON, not the request statuses.
return [].slice.apply(arguments, [0]).map(function (result) {
return result[0];
});
}).then(Globalize.load)
.then(function () {
Globalize.locale("de-DE");
});
});
Мой класс данных имеет аннотацию, подобную этой:
...
[Required]
[DataType(DataType.DateTime)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd.MM.yyyy}")]
public DateTime Geburtsdatum { get; set; }
...
И - очень важно!! - вы должны получить данные файлы! Это необходимо, поскольку данные clrd не являются частью пакета NuGet "jQuery.Validation.Globalize" / "jquery-globalize". (Да, это упоминается на странице проекта - но я этого не видел...:-()
Я установил Bower (для NuGet) и затем установил через Bower Cldr-данные. Пример:
bower install cldr-dates-full
(см. обзор пакетов и инструкция по установке 1)
Затем я переместил необходимые json-файлы (здесь вы найдете онлайн-инструмент для выбора файлов 2) из каталога "bower_components" в "scripts\cldr\main\de" и соответственно "scripts \ cldr \ extramental".
Я добавляю их в проект и отмечаю их как "Содержимое", "без копии".
Итак, наконец, это работает!!!:-)
Если мне удастся связать js- и json-файлы, я обновлю ответ.