Как сделать двухстороннюю привязку данных для полей DateTime с использованием ObjectDataSource - PullRequest
1 голос
/ 01 августа 2009

У меня есть страница ASP.Net 3.5, которая содержит элемент управления FormView, связанный с бизнес-объектом с использованием ObjectDataSource.

Одним из свойств бизнес-объекта является тип DateTime, и я хочу сделать двухстороннюю привязку данных для этого объекта, включая свойство DateTime.

Я использую пользовательский формат для отображения свойства DateTime, как показано здесь:

<asp:TextBox ID="TextBoxDate" runat="server" Text='<%# Bind("Date", "{0:d MMM yyyy HHmm}") %>' />

Отображается просто отлично. Проблема в том, когда я пытаюсь выполнить обновление. Я получаю следующее исключение:

Строка не была распознана как действительный DateTime.

Мой ObjectDataSource содержит явно установленный параметр UpdateParameter для этого свойства, но, похоже, он не имеет никакого значения.

    <UpdateParameters>
        <asp:Parameter Name="Date" Type="DateTime" />
    </UpdateParameters>

Что я делаю не так?

UPDATE:

Оказывается, что если я изменю строку формата в выражении Bind на

{0:d MMM yyyy HH:mm}

(Обратите внимание на двоеточие между ЧЧ и мм )

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 02 августа 2009

Вы можете переопределить событие ItemUpdating элемента управления FormView, а затем изменить значение этого параметра, чтобы убедиться, что оно имеет правильный формат. Скорее всего это означает:

  1. получить значение из e.NewValues ​​("Дата")
  2. Разбор строкового значения в объект DateTime
  3. присвоить значение обратно e.NewValues ​​("Дата")

В прошлом мне приходилось делать что-то подобное с валютными полями, где люди могли бы ввести знак доллара, что могло бы привести к ошибкам, если оставить их в покое.

1 голос
/ 02 августа 2009

Bind() метод, фактически обеспечивает двустороннюю привязку данных, а Eval обеспечивает одностороннюю привязку данных

В вашем сценарии вы должны изменить дату в событии формы databound, когда вы показываете данные пользователю, а не устанавливать формат даты в свойстве bind.

Таким образом вы не получите ошибку при обновлении ваших полей.

...