Проверка аннотации в Asp.net MVC просто принимает формат MM/dd/yyyy

Я провел несколько часов, читая много статей, но все еще не могу решить свою проблему.

у меня есть DateTime Тип собственности в моей модели:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
public System.DateTime StartTime { get; set; }

Я установил формат dd/MM/yyyy, поэтому я ожидаю, что дата, как 14/12/2014, будет принята. Однако проверка всегда завершается с сообщением: The field StartTime must be a date. Я попытался ввести 14.12.2014, и все в порядке.

После нескольких статей, которые я прочитал, я попытался изменить формат в коде бритвы, например:

@Html.TextBoxFor(model => model.StartTime, "{0:dd/MM/yyyy}")

И попробуйте использовать EditorFor как ataravati сказал в ответе ниже:

@Html.EditorFor(model => model.StartTime)

Или изменить культуру в web.config к культуре, в которой день идет раньше месяца, как ГБ:

<system.web>
    <globalization uiCulture="en" culture="en-GB"/>  
</system.web>

Но никто из них не работает для меня.

Я попытался использовать только текстовый ввод и ввести дату вручную (без использования какого-либо элемента управления, как jqueryUI). Однако проверка все еще не принимает мой ввод вручную, если он в формате дд / мм / гггг. Может кто-нибудь показать мне проблему или показать мне, как выяснить, в чем проблема?

ОБНОВЛЕНИЕ: Для кого-то, у кого может быть такая же проблема, как у меня.

После публикации, о которой Стивен упоминает ниже, мы должны создать проверку 'date', чтобы перезаписать проверку по умолчанию для проверки аннотаций. Пользовательская проверка, которую мы создадим, позволит формат, который мы хотим.

Однако после этого опубликованные данные в контроллере могут не содержать эти данные (в моем случае все значение datetime установлено на значение по умолчанию datetime). Причина в том, что настройка культуры не принимает ваш формат. Мы можем изменить настройку культуры в web.config, но я не думаю, что это лучший способ, потому что он может повлиять на другой тип значения (валюта, число....) в вашем проекте. По-моему, я создаю собственный ModelBinder для привязки Datetime в нужном формате (пример здесь: http://www.codeproject.com/Articles/605595/ASP-NET-MVC-Custom-Model-Binder).

Вышеупомянутое решение выглядит сложным. Это не должно быть так просто для прохождения проверки, но до сих пор я не нахожу ничего лучше. Поэтому, если у кого-то есть лучшее решение, позволяющее проверке аннотаций правильно проверять значение даты и времени в формате, поделитесь им.

2 ответа

ApplyFormatInEditMode опция работает только при использовании @Html.EditorForне @Html.TextBoxFor, Измените свой код бритвы на это:

@Html.EditorFor(model => model.StartTime)

На самом деле одна вещь, которая спасла меня, заключается в следующем: вам не нужны аннотации данных (если вы не хотите их и т. Д.):

@Html.TextBoxFor(m => m.StartDate, new { @Value = Model.StartDate.ToString("dd-MMM-yyyy") })

Приведенный выше формат, конечно, можно изменить на что угодно.

Конечно, популярная вещь, которую нужно сделать, это добавить, скажем, средство выбора даты. Я использую JQuery UI DatePicker для простоты использования:

@Html.TextBoxFor(model => model.StartDate, new { @Value = Model.StartDate.ToString("dd-MMM-yyyy"), @class = "form-control datepicker" })

Мой пример класса модели представления показан ниже для полноты:

[DisplayName("Start Date")]
[Required(ErrorMessage = "An start date must be supplied")]
public DateTime StartDate { get; set; }

Надеюсь, поможет.

Другие вопросы по тегам