【问题标题】:ASP.NET MVC Apply different DisplayFormat's for Edit and Display modesASP.NET MVC 为编辑和显示模式应用不同的 DisplayFormat
【发布时间】:2015-11-06 17:41:26
【问题描述】:

问题

我正在浏览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)

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

但是,当编辑此日期的视图使用以下方式呈现它时:

@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'. 这是一个问题,因为如果用户想要编辑条目,来自控件的日期永远不会被设置,所以用户不会知道之前/当前的值是什么。

半途而废

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

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

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

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

真正的问题

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

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

编辑

我想要实现的是这样的:

[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; }

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

【问题讨论】:

  • 使用 DisplayFor 吗?您还可以将 @Model.ReleaseDate.ToString() 与您想要的输出匹配的格式字符串一起使用。
  • @TiesonT。我不必...它只是那么漂亮和整洁。我的主要问题是,通过将@model.ReleaseDate.ToString() 与格式字符串一起使用,必须在显示发布日期的任何地方复制该格式字符串,这将比编辑的地方多得多。我刚刚在 Backs 答案中看到了您的评论。

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


【解决方案1】:

使用 TextBoxFor 方法的格式参数并覆盖 type 属性:

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

【讨论】:

  • 谢谢,但正如我在问题中所说的那样;我不想为日期使用文本框。如果您使用文本框,则不会获得 HTML5 日期选择器。
  • @JamesCrawshaw 您可以覆盖 htmlAttribute 参数中的 type 属性。
  • @TiesonT。 @Backs 它有效!非常感谢!。我最终使用的代码是:@Html.TextBoxFor(m => m.ReleaseDate, "{0:yyyy-MM-dd}", htmlAttributes: new {type="date"})。 @Backs - 如果你编辑你的答案,或者@TiesonT。 - 如果您使用此代码发布答案,我会将其标记为已回答。
  • 如果你会经常使用它,将它包装到扩展中也可能是有意义的。这样您就不必在任何地方重复相同的覆盖。
  • 这个主意不错。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
相关资源
最近更新 更多