Подтвердить что ты не робот

Вопрос о культуре даты MVC 4?

Я использую MVC 4 и задаюсь вопросом, есть ли ошибка в информации о культуре Datetime?

Я пытаюсь заставить австралийские даты работать (dd/MM/yyyy), но он продолжает говорить, что формат даты неверен, даже после puttig globalizaton для web.config. Я думал, что это ошибка с моим кодом, но даже если вы начинаете новый проект, это все равно происходит.

Я запустил новое веб-приложение MVC 4.

В файл web.config добавлено следующее:

<globalization culture="en-AU" uiCulture="en-AU" />

Затем я добавил в файл AccountModels.cs следующее:

[DataType(DataType.DateTime)]
[Required(ErrorMessage="Date is required")]
public DateTime? MyDate { get; set; }

Затем я добавил в файл Register.cshtml следующее:

<li>
    @Html.LabelFor(m => m.MyDate)
    @Html.TextBoxFor(m => m.MyDate)
</li>

Запустите приложение, перейдите на страницу регистрации, попробуйте дату, например, 26/03/2013, и в ней указано не допустимый формат.

Пожалуйста, помогите.

4b9b3361

Ответ 1

Попробуйте добавить этот атрибут к свойству MyDate:

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]

Хотя настройка культуры в файле web.config должна сделать это, это должно заставить ее в этом формате.

UPDATE

Хорошо, поэтому приведенный выше ответ действительно не решает проблему, хотя важно, если вы хотите изменить формат отображения даты. Важно отметить, что атрибут DisplayFormat не подхвачен помощником TextBoxFor, но он является помощником EditorFor.

В любом случае, к реальному решению. Проблема заключается в проверке jQuery, не учитывающей культуру при анализе даты. Если вы отключите проверку на стороне клиента, дата будет отлично разбираться на сервере, который знает о культуре.

Исправление состоит в том, чтобы переопределить проверку jQuery для даты и включить дополнительный плагин глобализации jQuery. Вы можете найти плагин globalize здесь. Вы также можете легко загрузить плагин с помощью диспетчера пакетов Nuget. Я только что открыл диспетчер пакетов, выбрал вкладку "Онлайн" слева и набрал "globalize" в поиске, и это был первый результат. Как только вы его установили, я включил эти два файла:

globalize.js
globalize.culture.en-AU.js

Вы можете включить их непосредственно с помощью тега script или поместить их в пакет, возможно, с другими файлами проверки jQuery.

После этого вам нужно будет добавить следующий script, чтобы переопределить проверку jQuery для даты:

<script type="text/javascript">
    $(function () {
        $.validator.methods.date = function (value, element) {
            Globalize.culture("en-AU");
            // 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>

И это, это должно сделать трюк. Я одобряю это решение для этого ответа: JQuery Validation и MVC 3. Как изменить формат даты Я просто хотел предоставить несколько пояснений, характерных для вашей проблемы.

Ответ 2

Принятый ответ не обновляется. Мое окончательное решение:

$(function () {
    $.validator.methods.date = function (value, element) {
        return this.optional(element) || moment(value, "DD.MM.YYYY", true).isValid();
    }
});

Вы должны включить это раньше:

@Scripts.Render("~/Scripts/jquery-3.1.1.js")
@Scripts.Render("~/Scripts/jquery.validate.min.js")
@Scripts.Render("~/Scripts/jquery.validate.unobtrusive.min.js")
@Scripts.Render("~/Scripts/moment.js")

Вы можете установить moment.js, используя:

Install-Package Moment.js

Ответ 3

Как насчет создания прокси-функции?

var _date = $.validator.methods.date;

$.validator.methods.date = function (value, element) {
    return _date.call(this, Globalize.parseDate(value), element);
};

Ответ 4

В дополнительной Турции Культура, которая ниже.

<globalization 
fileencoding="utf-8" 
requestencoding="utf-8" 
responseencoding="utf-8" 
culture="tr-TR" 
uiculture="tr-TR"/>