Проверка клиента / сервера MVC2 для DateTime / Date с использованием DataAnnotations - PullRequest
1 голос
/ 10 июня 2010

верно следующее:

  • Один из моих столбцов (BirthDate) имеет тип Date в SQL Server.
  • Этот же столбец (BirthDate) имеет тип DateTime, когда EF генерирует модель.
  • Я использую JQuery UI Datepicker на стороне клиента, чтобы иметь возможность выбрать дату рождения.

В моем классе собеседников есть следующая логика проверки:

[Required(ErrorMessageResourceType = typeof(Project.Web.ValidationMessages), ErrorMessageResourceName = "Required")]
[RegularExpression(@"\b(0?[1-9]|1[012])[/](0?[1-9]|[12][0-9]|3[01])[/](19|20)?[0-9]{2}\b", ErrorMessageResourceType = typeof(Project.Web.ValidationMessages), ErrorMessageResourceName = "Invalid")]
public virtual DateTime? BirthDate
{
    get;
    set;
}

Есть две проблемы с этим:

  1. Это не пройдет проверку на стороне сервера (если я включу проверку на стороне клиента, все будет работать нормально). Я предполагаю, что это потому, что регулярное выражение не учитывает часы, минуты, секунды, так как значение в текстовом поле уже было приведено как DateTime на сервере к моменту проверки.

  2. Если данные уже существуют в базе данных и считываются в модель и отображаются на странице, поле BirthDate показывает часы, минуты, секунды в моем текстовом поле (что мне не нужно). Я всегда могу использовать ToShortDateString (), но мне интересно, есть ли какой-то более чистый подход, который я мог бы упустить.

Спасибо

1 Ответ

1 голос
/ 10 июня 2010

1: Это легко решить, изменив значение DateTime на необнуляемое. Это означает, что введенное значение даты и времени должно быть разбираемым и, следовательно, действительным, а затем использовать атрибут:

[DataType(DataType.Date)]

вместорегулярное выражение.Это позволит убедиться, что поле является обязательным и должно обрабатываться.

2: Это проблема шаблонов.Самый простой способ - создать собственный шаблон Date.ascx внутри / Views / Shared / EditorTemplates, который вызывает ToShortDateString () и подключит ваш jquery datepicker.

Вот как выглядит мой:

<%@ Import Namespace="System.Web.Mvc.Html" %>
<%
string displayText = string.Empty;

if (Model != null)
{
    if (DateTime.Parse(Model.ToString()) != DateTime.MinValue)
        displayText = DateTime.Parse(Model.ToString()).ToShortDateString();
}
%>

<%= Html.TextBox("", displayText, new { @class = "date-box" })%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...