【问题标题】:Display empty editor for default values using EditorFor使用 EditorFor 显示默认值的空编辑器
【发布时间】:2013-07-16 12:23:23
【问题描述】:

我的模型有一个属性:

[Required]
[DataType(DataType.Date)]
public DateTime BirthDate { get; set; }

我使用 EditorFor 在我的(强类型)视图中显示:

<p>@Html.LabelFor(m => m.BirthDate)
   @Html.EditorFor(m => m.BirthDate)
   @Html.ValidationMessageFor(m => m.BirthDate)
</p>

当视图呈现时,出生日期文本框显示“01.01.0001”,即 DateTime 默认值。如果 BirthDate 值未初始化,这是正确的,但是在这种情况下我希望文本框为空。

执行此操作的标准方法是什么?我不想在我的模型中使用 Nullable,因为 BirthDate 是必需值。

【问题讨论】:

    标签: asp.net-mvc-4


    【解决方案1】:

    您很可能正在寻找DisplayFormat 属性。此外,除非您使用的是 DateTime?/Nullable&lt;DateTime&gt;,否则您可能会在 1 月 1 日结束(因为不能有空值)。

    如果您确实决定使用 DateTime?/Nullable&lt;DateTime&gt; 强制使用 [Required] 的值应该可以避免您所说的任何问题,所以如果这是您的犹豫,我不会太担心。

    作为最后一种选择,您可以覆盖 DateTime.cshtml(或 Date.cshtml,因为您使用的是 DataType 属性)模板 (~/Views/Shared/DisplayTemplates/),并在填充时将文本框设为空default(DateTime)。例如

    @model DateTime
    @Html.TextBox(String.Empty, Model == default(DateTime) ? String.Empty : Model)
    

    (或类似的东西)

    【讨论】:

    • DisplayFormat 没有帮助,因为我无法定义显示“无”的格式,而且我宁愿不使用 Nullable,因为更改业务对象以适应 View 功能感觉不像干净的关注点分离。然而,模板(放置在 ~/Shared/EditorTemplates 中)完全符合我的需要。谢谢!
    • @matk:请记住,业务对象(如 POCO)通常保存在服务器端,而 VM 用于显示(然后使用 AutoMapper 之类的东西可以更容易地将两者结合起来)。话虽如此,使 VM 具有可为空的属性并不是那么糟糕,因为它最终只会在您的操作中填充 POCO,同时保持 UI 中的外观和感觉。
    • 是的,如果使用了 ViewModel。我更喜欢基于模板的方法,因为无论是否使用 ViewModel,它都会处理所有显示 DateTime 的实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    相关资源
    最近更新 更多