Использование новой привязки модели в asp.net 4.5 для форматирования полей даты

Раньше, до asp.net 4.5, мы могли легко привязать дату к Gridview, Formview или другому элементу управления с привязкой к данным и сделать его презентабельным с помощью простой строки формата.

            <asp:TextBox 
                ID="DateFieldTextBox" 
                runat="server" 
                Text='<%# Bind("DateField","{0:d}") %>'/>

Новая строго типизированная привязка модели немного сложнее.

            <asp:TextBox 
                ID="DateFieldTextBox" 
                runat="server" 
                Text='<%# BindItem.DateField %>'/>

будет работать, но выдает полную строку даты/времени, а не только дату.

            <asp:TextBox 
                ID="DateFieldTextBox" 
                runat="server" 
                Text='<%# BindItem.DateField.ToShortDateString() %>'/>

.. это должно работать, но выдает ошибку времени компиляции «Недопустимый синтаксис кода для BindItem». Item.DateField.ToShortDateString() работает, но не привязывается к обратной передаче.

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


person John Hoge    schedule 31.08.2012    source источник
comment
также не работает при попытке этого: '<%# string.Format(CultureInfo.CurrentCulture, "{0:d}", BindItem.InfoBirthday) %>', он говорит: Сообщение об ошибке компилятора: CS0103: имя «BindItem» не существует в текущем контексте   -  person Nikola Bogdanović    schedule 23.07.2013
comment
stackoverflow.com/questions/17824427/   -  person senthilkumar2185    schedule 29.07.2013
comment
stackoverflow.com/questions/17824427/   -  person senthilkumar2185    schedule 29.07.2013
comment
@senthilkumar: ты вообще читал вопрос? нам нужна альтернатива для новой привязки модели - и никогда не используйте старую Eval (отражение поздней привязки), а вместо этого Container.DataItem: string.Format("{0:d}", ((DataRowView)Container.DataItem)["DateField"])   -  person Nikola Bogdanović    schedule 30.07.2013


Ответы (4)


Для отображения данных в виде сетки вы можете сделать Item.DateField.ToShortString(), и он будет работать, поскольку это односторонняя привязка данных. то есть вы показываете то, что уже есть в записи. BindItem.DateField.ToDateString() преобразует объект из DateTime в строку, что приведет к ошибке, как вы уже видите. Вы можете продолжать использовать Bind (выражение, формат) в представлении формы при редактировании поля или для принятия новой записи.

person Anand    schedule 09.10.2012

Я боролся с этим довольно долго. Мое решение состояло в том, чтобы объединить аннотации данных в модели данных вместе с использованием DynamicControl в моем FormView. Я предположил, что это проект WebForms, а не проект MCV.

Почитайте немного о доступе к данным. в веб-формах. Это одно из лучших описаний MS по элементам управления доступом/представлению данных WebForms и включает ссылки на DynamicControl.

//I know you want this, and I did too.  It seems like it could/should work, but it doesn't        
<asp:TextBox 
     ID="DateFieldTextBox" 
     runat="server" 
     Text='<%# BindItem.DateField.ToShortDateString() %>'/>

//This works, but you also need to use the Data Annotations in your model.
<asp:DynamicControl
     ID="DateFieldTextBox"
     runat="server"
     DataField="DateField"
     Mode="Edit" />

//sample model annotations in your object class
  [Column(TypeName = "date"), DataType(DataType.Date), DisplayFormat(DataFormatString = "  {0:MM/dd/yyyy}", ApplyFormatInEditMode = true )]
  public DateTime DateField { get; set; }

Я буду использовать этот шаблон, потому что мне нужна двусторонняя привязка модели с возможностью представления дат в правильном формате (а также валюты и т. д.). Очень жаль, что элемент управления TextBox не поддерживает форматирование данных модели полностью. DataAnnotations в этом контексте игнорируются. Двусторонняя привязка работает при отсутствии форматирования, но не при необходимости форматирования. Это похоже на неполную реализацию WebForms IMO.

С другой стороны, использование DynamicControl работает, но вы не получаете Intellisense для свойства DataField, которое предоставило бы вам элементы модели во время кодирования. Что???? Еще одно неполное и менее предпочтительное решение.

person secretwep    schedule 04.11.2014
comment
Идея вот у меня сработала (привязка в репитер). Аннотировал свойство с помощью DisplayFormat и использовал DynamicControl вместо BindItem.Bind. Intellisense также работает внутри динамического управления, что приятно. - person PaulTheCyclist; 13.11.2014

Наконец, после двух дней борьбы, я получил решение этой проблемы с двусторонней привязкой модели для форматированного значения поля. Просто удалите одинарную или двойную кавычку "" или '' после текста свойства TextBox. Это работает для меня как шарм!! Но если вы используете свойство TextMode TextBox to Date, удалите его. Потому что он не будет отображать значение с сервера или БД. Если вы хотите использовать средство выбора даты или календарь, вы можете просто добавить элемент управления AJAX CalendarExtender, чтобы выбрать дату из календаря.

<asp:TextBox ID="DateFieldTextBox" runat="server" Text=<%# Bind("DateField","{0:d}") %>/>
person EsseyG    schedule 08.06.2015

Приносим извинения за воскрешение этой темы, но вы рассматривали возможность добавления аннотаций данных в свой класс модели? Другими словами:

using System.ComponentModel.DataAnnotations;

[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
public DateTime DateField { get; set; }

Кажется, это работает для меня, хотя я не знаю подробностей вашего случая.

person karfus    schedule 14.07.2014