在asp.net 4.5中使用新的模型绑定来格式化日期字段

时间:2012-08-31 15:19:14

标签: visual-studio-2012 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()有效,但不会在回发上绑定。

现在我们已经恢复了原来的语法,但是我们希望能够进行现代编译时检查,但仍然可以很好地格式化日期。其他人之前遇到过这个吗?

4 个答案:

答案 0 :(得分:2)

为了在网格视图中显示数据,您可以执行Item.DateField.ToShortString(),它将工作,因为它是单向数据绑定。即你已经记录了记录中的内容。 BindItem.DateField.ToDateString()会将对象从DateTime转换为字符串,这将导致您已经看到的错误。您可以在编辑字段时继续在窗体视图中使用绑定(表达式,格式),也可以用于记录新条目。

答案 1 :(得分:1)

我在这方面挣扎了很长时间。我的解决方案是在数据模型中结合数据注释以及在FormView中使用DynamicControl。我假设这是一个WebForms项目而不是MCV项目。

阅读data access in WebForms领域的一点内容。这是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可以工作,但是在DataField属性上没有Intellisense,它会在编码时为您提供模型的成员。什么????另一个不完整且不太优选的解决方案。

答案 2 :(得分:1)

最后经过两天的努力,我得到了格式化字段值的双向模型绑定问题的解决方案。只需在TextBox的属性文本后删除单引号或双引号“”或“”。它对我来说就像一个魅力!但是,如果将TextBox的TextMode属性用于Date,请将其删除。因为,它不会显示来自服务器或数据库的值。如果您想使用日期选择器或日历,您可以简单地添加一个AJAX CalendarExtender控件来从日历中选择日期。

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

答案 3 :(得分:0)

为恢复此线程而道歉,但您是否考虑将数据注释添加到模型类中?换句话说:

using System.ComponentModel.DataAnnotations;

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

这似乎对我有用,虽然我不知道你案件的具体细节。