【问题标题】:ASP.Net MVC Razor Remove Time From DateTime PropertyASP.Net MVC Razor 从 DateTime 属性中删除时间
【发布时间】:2012-06-20 14:48:50
【问题描述】:

我正在使用 Razor 视图开发一个 ASP.Net MVC 3 Web 应用程序。我有以下 ViewModel,它被传递给我的 Razor 视图并迭代以显示记录列表。

视图模型

public class ViewModelLocumEmpList
{
    public IList<FormEmployment> LocumEmploymentList {get; set;}
}

查看

<table>
  <tr>
   <th>Employer</th>
   <th>Date</th>
   </tr>
    @foreach (var item in Model.LocumEmploymentList) {
      <tr>
        <td>@item.employerName</td>
        <td>@item.startDate</td>
      </tr>
      }
      </table>

我的问题是这条线

@Html.DisplayFor(modelItem => item.startDate)

返回这样的日期 20/06/2012 00:00:00,我希望它删除时间并仅显示日期,即 20/06/ 2012 年。

我已经尝试添加

@Html.DisplayFor(modelItem => item.startDate.Value.ToShortDateString())

和

DisplayFor(modelItem => item.startDate.HasValue ? item.startDate.Value.ToShortDateString(): "")

但是,它们都在运行时返回以下错误消息

Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.

我在这里查看了 Darin Dimitrov 的回答 Converting DateTime format using razor

但是,我无权访问我的 ViewModel 中的 startDate 属性,我的 ViewModel 返回一个 IList 的 FormEmployment 对象,您可以在上面看到。

如果有人对如何从日期时间属性中删除时间有任何想法,那么我将不胜感激。

谢谢。

另外,我的 startDate 属性是 Nullable。

更新

根据 PinnyM 的回答,我添加了一个部分类(见下文)以将 [DisplayFormat] 属性放置在 startDate 属性上。

public partial class FormEmployment
{
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
    public Nullable<System.DateTime> startDate { get; set; }
}

但是,我的 Razor View 仍然使用以下代码显示 20/06/2012 00:00:00

@Html.DisplayFor(modelItem => item.startDate)

有什么想法吗?

谢谢。

【问题讨论】:

    标签: asp.net-mvc-3 datetime razor


    【解决方案1】:

    您可以使用@item.startDate.Value.ToShortDateString()(为空值添加适当的验证)

    【讨论】:

    • 正如我在问题中所说,我已经尝试使用 @Html.DisplayFor(modelItem => item.startDate.Value.ToShortDateString()) 导致与上述相同的错误。跨度>
    • 不要使用DisplayFor,只需设置@item.startDate.Value.ToShortDateString()
    • @Pollirata:干杯,这行得通。但是,你能解释一下为什么它在没有 DisplayFor 的情况下工作,以及为什么当我包含 DisplayFor 时它不能工作?谢谢。
    • 我不确定,我之前没有在循环中使用过它......但我遇到了类似的问题,这就是我解决它的方式
    • 原因是因为DisplayFor 期待一个只能使用简单构造(属性、布尔运算符等)解析的表达式 lambda
    【解决方案2】:

    您可以在模型startDate 属性上使用 DisplayFormat 属性:

    [DisplayFormat(DataFormatString="{0:dd/MM/yyyy}")]
    public DateTime? startDate { get; set; }
    

    只用DisplayFor(modelItem =&gt; item.startDate)

    另一种选择是为格式化创建一个只读属性:

    public String startDateFormatted { get { return String.Format("{0:dd/MM/yyyy}", startDate); } }
    

    并使用DisplayFor(modelItem =&gt; item.startDateFormatted)

    【讨论】:

    • 我不能这样做,因为我的模型类是由 T4 模板创建的,因此,每次我重新生成模板时,我的更改都会被覆盖,尽管我可以创建一个部分类来保存这个单一的属性。
    • 请参阅我的更新问题。谢谢。
    • 请参阅stackoverflow.com/questions/2105580/… 和ryanhayes.net/blog/…,了解使用部分类和元数据类的方法。
    • 将属性 ApplyFormatInEditMode 添加到第一个解决方案的 dataAnnotations 中:[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/mm/yyyy}")]
    【解决方案3】:

    对我来说,我可以做与上述答案类似的事情,但使用“Value”属性会一直出错。

    <td>
    @item.DOB.ToShortDateString()
    </td>
    

    其他需要注意的事项:我正在使用带有 .NET 5 框架的 ASP.Net Core MVC,因此不确定这些天是如何分类或调用的。

    希望这可以帮助其他人在以后遇到这个问题。

    【讨论】:

      猜你喜欢
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多