【问题标题】:How to render a DateTime in a specific format in ASP.NET MVC 3?如何在 ASP.NET MVC 3 中以特定格式呈现 DateTime?
【发布时间】:2011-08-25 11:47:23
【问题描述】:

如果我的模型类中有 DateTime 类型的属性,我如何以特定格式呈现它 - 例如以 ToLongDateString() 返回的格式?

这个我试过了……

@Html.DisplayFor(modelItem => item.MyDateTime.ToLongDateString())

...抛出异常,因为表达式必须指向属性或字段。还有这个……

@{var val = item.MyDateTime.ToLongDateString();
  Html.DisplayFor(modelItem => val);
}

...它不会引发异常,但呈现的输出为空(尽管val 包含预期值,正如我在调试器中看到的那样)。

提前感谢您的提示!

编辑

ToLongDateString 只是一个例子。我真正想使用而不是ToLongDateString 的是DateTimeDateTime? 的自定义扩展方法:

public static string FormatDateTimeHideMidNight(this DateTime dateTime)
{
    if (dateTime.TimeOfDay == TimeSpan.Zero)
        return dateTime.ToString("d");
    else
        return dateTime.ToString("g");
}

public static string FormatDateTimeHideMidNight(this DateTime? dateTime)
{
    if (dateTime.HasValue)
        return dateTime.Value.FormatDateTimeHideMidNight();
    else
        return "";
}

所以,我认为我不能在 ViewModel 属性上使用 DisplayFormat 属性和 DataFormatString 参数。

【问题讨论】:

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


    【解决方案1】:

    您可以使用[DisplayFormat] 属性装饰您的视图模型属性:

    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", 
                   ApplyFormatInEditMode = true)]
    public DateTime MyDateTime { get; set; }
    

    在你看来:

    @Html.EditorFor(x => x.MyDate)
    

    或者,为了显示值,

    @Html.DisplayFor(x => x.MyDate)
    

    我不推荐的另一种可能性是使用弱类型帮助器:

    @Html.TextBox("MyDate", Model.MyDate.ToLongDateString())
    

    【讨论】:

    • @Darin:我不想要输入元素,只想要静态文本输出。我还要提一下,实际格式是由DateTime 的自定义扩展方法创建的(ToLongDateString 只是一个例子),所以我不太可能使用DataFormatString
    • @Slauma,@Html.DisplayFor(x => x.MyDateTime) 怎么样。 @NickLarsen 这就是应该使用视图模型的原因。在我的示例中,我使用此属性装饰视图模型,并且视图已经绑定到给定视图,这就是它的目的。
    • @Slauma,好的,在这种情况下,您可以使用自定义显示模板或让您的视图模型使用字符串属性,当您在模型和模型之间进行映射时,转换将在映射层完成视图模型(这样你仍然只能在视图中使用 Html.DisplayFor)。
    • @NickLarsen,不,这是每个视图一个视图模型。正是因为人们犯了这个错误,所以像 如何在一个控制器操作中而不是其他控制器操作中从验证中排除某些属性? 这样的问题在 SO 上很常见。
    • 一年后回到这个问题,我同意每个视图一个模型的论点。我仍然认为处理显示选项的任何内容都属于视图而不是模型。
    【解决方案2】:

    如果您的所有DateTime 类型都以相同的方式呈现,您可以使用自定义DateTime 显示模板。

    在您的视图文件夹中,在您的控制器特定视图文件夹下或在“共享”文件夹下创建一个名为“DisplayTemplates”的文件夹(这些工作类似于部分)。

    在里面创建一个名为DateTime.cshtml 的文件,将DateTime 作为@model,并编写您希望如何呈现日期的代码:

    @model System.DateTime
    @Model.ToLongDateString()
    

    现在您可以在视图中使用它,它应该可以工作:

    @Html.DisplayFor(mod => mod.MyDateTime)
    

    只要您遵循将其添加到“DisplayTemplates”文件夹并命名文件以匹配您正在显示的类型的约定,MVC 就会自动使用它来显示您的值。这也适用于使用“EditorTemplates”编辑场景。

    Here's some more information on templates.

    【讨论】:

    • 谢谢,我刚刚测试了它,如果类型真的是DateTime,它就可以正常工作。但是我有一些可以为空的 DateTime 属性。我尝试在DisplayTemplates 文件夹中创建第二个文件,名为NullableDateTime.cshtml 并在其中:@using MyHelpers @model System.DateTime? @Model.MyCustomExtension() 这里MyCustomExtensionDateTime? 的扩展方法。但是,当 DateTime?字段确实为空,告诉我字典需要DateTime 类型的模型元素,它不为空。有没有办法为可为空的 DateTime 定义 DisplayTemplate?
    • @Slauma:嗯,好问题。我可能会坚持使用NullableDateTime.cshtml 并使用@NickLarsen 建议的方法并使用@Html.DisplayFor(m => m.MyDateTime, "NullableDateTime")
    • 如果您的 DateTime.cshtml 模板设置为“@model DateTime?”,则无需显式添加模板名称。而不是“日期时间”。这样所有的日期(是否可以为空)都由同一个模板处理......
    【解决方案3】:

    如果您只想以特定格式显示日期,只需调用:

    @String.Format(myFormat, Model.MyDateTime)
    

    使用@Html.DisplayFor(...) 只是额外的工作,除非您指定模板,或者需要使用基于模板构建的东西,例如迭代IEnumerable<T>。创建模板很简单,也可以提供很大的灵活性。在您的视图文件夹中为当前控制器(或共享视图文件夹)创建一个名为 DisplayTemplates 的文件夹。在该文件夹中,添加一个带有您要为其构建模板的模型类型的局部视图。在这种情况下,我添加了/Views/Shared/DisplayTemplates 并添加了一个名为ShortDateTime.cshtml 的局部视图。

    @model System.DateTime
    
    @Model.ToShortDateString()
    

    现在您可以使用以下行调用该模板:

    @Html.DisplayFor(m => m.MyDateTime, "ShortDateTime")
    

    【讨论】:

    • 谢谢,这看起来不错,而且这个模板参数(“ShortDateTime”)也解决了我在对 ataddeini 答案的评论中描述的问题。
    • 如果类型是“日期时间?”而不是“DateTime”(@model DateTime?)...... ciplay 模板将处理可空或不可空的日期时间。文件名应保持为“DateTime.cshtml”。
    • +1 不得不对此发表评论,在我的应用程序中工作得很好!谢谢!
    • 使用@Html.DisplayFor() 不是额外的工作,它渲染模型的html表示,即使没有模板......不要混淆......
    • stackoverflow.com/questions/19920603/… 包含有助于处理@Romias 提及的可空日期时间的代码。
    【解决方案4】:

    模型内部的简单格式化输出

    @String.Format("{0:d}", model.CreatedOn)
    

    或者在foreach循环中

    @String.Format("{0:d}", item.CreatedOn)
    

    【讨论】:

    • 似乎与使用string.Format的公认答案重复
    • @PaulTyng 这个答案对我来说比接受的答案更清楚,odesuk 实际上在第一个参数中显示了格式,作为新手,这对我有帮助。
    • 我同意,这是对我有帮助的答案。
    【解决方案5】:

    只有这样查看文件调整。你可以试试这个。

    @Html.FormatValue( (object)Convert.ChangeType(item.transdate, typeof(object)), 
                                "{0: yyyy-MM-dd}")
    

    item.transdate 是你的DateTime 类型数据。

    【讨论】:

      【解决方案6】:

      如果我只想以短格式显示日期,我只是使用 @Model.date.ToShortDateString() 并在

      中打印日期

      【讨论】:

        【解决方案7】:

        如果您只想以特定格式显示日期,只需调用:

        @Model.LeadDate.ToString("dd-MMM-yyyy")
        
        @Model.LeadDate.ToString("MM/dd/yy")
        

        会产生如下格式,

        26-Apr-2013
        
        04/26/13
        

        【讨论】:

        • 如果@Model.LeadDate == null 会发生什么?
        【解决方案8】:

        我的偏好是将格式细节保留在视图中,而不是视图模型中。所以在 MVC4/Razor 中:

        @Html.TextBoxFor(model => model.DateTime, "{0:d}");
        

        日期时间格式参考: http://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.71).aspx

        然后我绑定了一个 JQuery 日期选择器,然后将日期设置为不同的格式...doh!

        看来我需要将日期选择器的格式设置为相同的格式。

        所以我将System.Globalization 格式存储在 data-* 属性中,并在设置时收集它

        @Html.TextBoxFor(
            model => model.DateTime.Date, 
            "{0:d}", 
            new 
            { 
                @class = "datePicker", 
                @data_date_format=System.Globalization.CultureInfo
                                  .CurrentUICulture.DateTimeFormat.ShortDatePattern 
            }));
        

        这是最糟糕的部分:.net 和 datepicker 的格式不匹配,所以需要hackery:

        $('.datePicker').each(function(){
            $(this).datepicker({
                dateFormat:$(this).data("dateFormat").toLowerCase().replace("yyyy","yy")
            });
        });
        

        这有点弱,但应该涵盖很多情况。

        【讨论】:

        • 前 3 行是最重要的 :) 示例和指向格式定义的链接
        【解决方案9】:

        为我工作

        <%=Model.MyDateTime.ToString("dd-MMM-yyyy")%>
        

        【讨论】:

        • 这个问题显然是使用剃刀视图引擎,你已经用不同的语言回答了。
        【解决方案10】:

        我使用以下方法来内联格式并显示模型中的日期属性。

        @Html.ValueFor(model => model.MyDateTime, "{0:dd/MM/yyyy}")
        

        否则,在填充文本框或编辑器时,您可以像@Darin 建议的那样,用[DisplayFormat] 属性修饰属性。

        【讨论】:

        • 这就是我正在寻找的解决方案!
        • 这就是我一直在寻找的解决方案!
        【解决方案11】:

        最近遇到了同样的问题。

        我发现在模型中简单地将 DataType 定义为 Date 也可以(使用 Code First 方法)

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

        【讨论】:

          【解决方案12】:

          这将在您的视图中以dd/MM/yyyy 格式显示

          在视图中:

          使用此代码代替DisplayFor

          <td>
          
          @(item.Startdate.HasValue ? item.Startdate.Value.ToString("dd/MM/yyyy") : "Date is Empty")
          
          </td
          

          它还检查日期列中的值是否为空,如果为真,则显示日期为空或列中的实际格式化日期。

          希望能帮助别人。

          【讨论】:

            【解决方案13】:
            @{
              string datein = Convert.ToDateTime(item.InDate).ToString("dd/MM/yyyy");        
              @datein
            }
            

            【讨论】:

              【解决方案14】:

              如果你的模型是日期时间,我会在 MVC5 中使用

              string dt = Model.ToString("dd/MM/yyy"); 
              

              或者如果您的模型包含日期时间的属性

              string dt = Model.dateinModel.ToString("dd/MM/yyy"); 
              

              这是格式的官方含义:

              https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx

              【讨论】:

                【解决方案15】:

                你可以这样做@item.Date.Value.Tostring("dd-MMM-yy");

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2010-11-22
                  • 2011-09-17
                  • 2011-12-20
                  • 2011-07-23
                  • 1970-01-01
                  • 2013-08-19
                  • 1970-01-01
                  相关资源
                  最近更新 更多