在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()有效,但不会在回发上绑定。
现在我们已经恢复了原来的语法,但是我们希望能够进行现代编译时检查,但仍然可以很好地格式化日期。其他人之前遇到过这个吗?
答案 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; }
这似乎对我有用,虽然我不知道你案件的具体细节。