ASP.NET MVC为编辑和显示模式应用不同的DisplayFormat

Err*_*sen 10 c# asp.net-mvc html5 date

问题

我正在浏览ASP.NET MVC 4教程(但我认为这也适用于MVC 5),您可以在其中为电影商店创建一个网站.

电影模型具有DateTime类型的ReleaseDate属性.通常,这个日期将被视为比编辑日期更多,因此我应用以下属性来很好地渲染它.

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd-MMM-yyyy}")]
public DateTime ReleaseDate { get; set; }
Run Code Online (Sandbox Code Playgroud)

显示此日期的视图呈现时使用:

@Html.DisplayFor(model => model.ReleaseDate)
Run Code Online (Sandbox Code Playgroud)

正如您所期望的那样,它显示格式正确:

格式很好的日期

但是,当编辑此日期的视图使用它时:

@Html.EditorFor(model => model.ReleaseDate)
Run Code Online (Sandbox Code Playgroud)

它显示一个可爱的HTML5日期选择器,但没有填写值,因为日期的格式错误(错误消息是The specified value '11/01/1989 00:00:00' does not conform to the required format, 'yyyy-MM-dd'. 这是一个问题,因为如果用户想要编辑一个条目,控件的日期永远不会被设置,因此用户将不知道先前/当前值是什么.

在此输入图像描述

中途解决方案

我通过阅读其他类似问题找到的解决方案是将模型中的DisplayFormat设置为yyyy-MM-dd,make适用于编辑控件:

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime ReleaseDate { get; set; }
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为它在编辑期间自动填充HTML5日期选择器的值(使用@Html.EditorFor()):

在此输入图像描述

但是当我正在显示时(使用`@ Html.DisplayFor()),我会遇到丑陋的ISO格式日期:

在此输入图像描述

真正的问题

我真正的问题是:我可以在模型中设置正常显示和编辑模式的不同显示格式吗?

  • 我不想使用文本框来编辑日期 - 我想使用HTML5日期选择器; 它比使用文本框好得多.
  • 我也不是真的想要更改显示日期的所有视图,直接从模型中获取属性并使用自定义格式对其进行格式化,这有点否定了DisplayFormat属性的要点.(我想@Html.DisplayFor用于显示和@Html.EditorFor编辑)

我希望一切都有道理 - 我是asp.net的新手,所以不完全熟悉这些控件和属性.

编辑

我想要实现的是这样的:

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] // use this format for edit controls
[DisplayFormat(DataFormatString = "{0:dd-MMM-yyyy}", ApplyFormatInEditMode = false)] // use this format for display controls
public DateTime ReleaseDate { get; set; }
Run Code Online (Sandbox Code Playgroud)

但是一个属性不能有两个显示格式属性.

Bac*_*cks 11

对方法TextBoxFor使用format参数并覆盖type属性:

@Html.TextBoxFor(m => m.ReleaseDate, "{0:yyyy-MM-dd}", htmlAttributes: new { @type="date" })
Run Code Online (Sandbox Code Playgroud)

  • @JamesCrawshaw你可以覆盖htmlAttribute参数中的type属性. (2认同)
  • 如果您将使用这一点,将它包装到扩展中也可能是有意义的.然后你不必在任何地方重复相同的覆盖. (2认同)