Asp.net mvc 如何在MVC2中为双向绑定设置视图中日期的格式?

Asp.net mvc 如何在MVC2中为双向绑定设置视图中日期的格式?,asp.net-mvc,asp.net-mvc-2,Asp.net Mvc,Asp.net Mvc 2,假设我有一个访问日期的视图: <%= Html.TextBoxFor(model => Model.Birthday) %> Model.birth)%%> 如何让我的视图指定日期的格式?我想使用,这是双向的(用于显示和数据输入),这一点很重要。使用一个特定的ViewModel类,该类包含一个字符串,该字符串的格式与生日相同,并使用该字符串在文本框中显示。发布表单时,如果您对域对象本身使用默认绑定,它应该为您解析字符串。如果您使用的是ViewModel,则必须在发布表单时对

假设我有一个访问日期的视图:

<%= Html.TextBoxFor(model => Model.Birthday) %>
Model.birth)%%>

如何让我的视图指定日期的格式?我想使用,这是双向的(用于显示和数据输入),这一点很重要。

使用一个特定的ViewModel类,该类包含一个字符串,该字符串的格式与生日相同,并使用该字符串在文本框中显示。发布表单时,如果您对域对象本身使用默认绑定,它应该为您解析字符串。如果您使用的是ViewModel,则必须在发布表单时对其进行解析。

在您的模型中,可以使用System.ComponentModel.DataAnnotations元数据来指定属性的格式。e、 g

[DisplayFormat(DataFormatString="{0:MM/dd/yyyy}")]
public DateTime Birthday { get; set; }

Then, in your view, use:
<%= Html.EditorFor(model => model.Birthday) %>
[DisplayFormat(DataFormatString=“{0:MM/dd/yyyy}”)]
公共日期时间生日{get;set;}
然后,在您看来,使用:
型号(生日)%>

不幸的是,常规的HTML帮助程序不尊重元数据,因此您必须使用HTML.EditorFor。

我有点惊讶地看到,您不能在HTML.EditorFor()中抛出格式字符串。我已经开始使用EditorTemplates了

在解决方案中创建目录结构

视图>共享>编辑模板

在EditorTemplates文件夹中添加一个新的MVC 2用户控件,并将其命名为DateTime.ascx。EditorFor(DateTime)现在将使用此用户控件进行显示

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<DateTime?>" %>
<%= Html.TextBox(string.Empty, (Model.HasValue ? Model.Value.ToShortDateString() : string.Empty)) %>


除了视图之外,这似乎是错误的。MVC中的整个视图都是处理这些类型的操作。ASP.NET MVC v2真的那么短视吗?(当然,尽管我在这里使用了文本语气,但我并不冒犯您——我只是对这不是一件小事感到震惊!)我明白您的观点,但我认为ViewModel类应该包含特定的视图相关逻辑,并将日期的业务概念转换为字符串表示以供显示。视图本身就是HTML并显示字符串表示。别误会,我不反对视图模型及其在MVC视图级别的存在,但这应该比简单地格式化日期更复杂。我将此标记为一个答案,尽管我对此非常不满意。我为扩展写了一个FormattedTextBoxforExtension,我让它工作得很好,除了在发布时清除值,但这是另一个问题。一旦我能弄清楚如何清理post数据,我就会把它发布到CodePlex上。有用的DataAnnotation标签,我不知道,但是,我拒绝把它放到我的模型中,因为那样我做MVC是错误的。也许是我的ViewModel,但我仍然不喜欢这个解决方案,因为它绝对属于视图,而不属于其他任何地方+但是信息是1。这对两个方向的绑定都有效吗?i、 e.当你发布时,你在这里输入的值会被发送回模型中?是的。所以,假设您为十进制设置一个,并将文本框格式化为货币。在post方法中,必须去掉美元符号,否则ModelState.IsValid将返回false。