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

时间:2015-08-13 16:21:05

标签: c# asp.net-mvc html5 date

问题

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

电影模型具有DateTime类型的ReleaseDate属性。 通常,这个日期的查看次数会比编辑的日期多,所以我应用了以下属性来很好地渲染它。

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

显示的视图时,此日期会使用以下内容呈现:

@Html.DisplayFor(model => model.ReleaseDate)

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

Nicely formatted dates

但是,当编辑的视图时,此日期会使用以下内容进行渲染:

@Html.EditorFor(model => model.ReleaseDate)

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

enter image description here

中途解决方案

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

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

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

enter image description here

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

enter image description here

真实问题

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

  • 我不想使用文本框来编辑日期 - 我想使用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; }

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

1 个答案:

答案 0 :(得分:10)

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

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