问题
我正在运行 tutorials for ASP.NET MVC 4 (但我认为这也适用于 MVC 5),您可以在其中为电影商店创建一个网站。
电影模型有一个类型为 DateTime 的 ReleaseDate 属性。 通常这个日期被查看的次数多于被编辑的次数,因此我应用了以下属性来很好地呈现它。
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd-MMM-yyyy}")]
public DateTime ReleaseDate { get; set; }
当显示此日期的 View 使用以下方式呈现它时:
@Html.DisplayFor(model => model.ReleaseDate)
如您所料,它的显示格式很好:
但是,当编辑此日期的 View 使用以下方式呈现它时:
@Html.EditorFor(model => model.ReleaseDate)
它显示了一个可爱的 HTML5 日期选择器,但没有填写值,因为日期格式错误(错误消息是 The specified value '11/01/1989 00:00:00' does not符合要求的格式,'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())
:
但是当我显示时(使用 `@Html.DisplayFor()),我坚持使用丑陋的 ISO 格式日期:
真正的问题
我真正的问题是:我可以在模型中设置正常显示和编辑模式的不同显示格式吗?
- 我不想使用文本框来编辑日期 - 我想使用 HTML5 日期选择器;这比使用文本框好得多。
- 我也不想更改所有显示日期的 View 以直接从模型中获取属性并使用自定义格式对其进行格式化,这有点否定了 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; }
但是一个属性不能有两个显示格式属性。
最佳答案
为方法 TextBoxFor 使用格式参数并覆盖类型属性:
@Html.TextBoxFor(m => m.ReleaseDate, "{0:yyyy-MM-dd}", htmlAttributes: new { @type="date" })
关于c# - ASP.NET MVC 为编辑和显示模式应用不同的 DisplayFormat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31993584/