【问题标题】:@Html.DisplayFor - DateFormat ("mm/dd/yyyy")@Html.DisplayFor - 日期格式(“mm/dd/yyyy”)
【发布时间】:2015-03-22 18:51:05
【问题描述】:

我有以下剃须刀代码,我想要mm/dd/yyyy 日期格式:

Audit Date: @Html.DisplayFor(Model => Model.AuditDate)

我尝试了许多不同的方法,但这些方法都不适用于我的情况

我的 AuditDate 是 DateTime? 类型

我尝试过这样的事情并得到了这个错误:

@Html.DisplayFor(Model => Model.AuditDate.Value.ToShortDateString())

附加信息:模板只能用于字段访问、属性访问、单维数组索引或单参数自定义索引器表达式。

试过这个:

@Html.DisplayFor(Model => Model.AuditDate.ToString("mm/dd/yyyy"))

方法 'ToString' 没有重载需要 1 个参数

【问题讨论】:

    标签: asp.net asp.net-mvc


    【解决方案1】:

    如果你只是简单的输出那个模型属性的值,你就不需要DisplayFor html helper,直接用proper string formatting调用就行了。

    Audit Date: @Model.AuditDate.Value.ToString("d")

    应该输出

    Audit Date: 1/21/2015

    最后,您的审核日期可能为空,因此您应该在尝试格式化可空值之前进行条件检查。

    @if (item.AuditDate!= null) { @Model.AuditDate.Value.ToString("d")}
    

    谷歌搜索您收到的错误provides this answer,这表明错误是由于在您的 Html 帮助程序中使用了模型一词。例如,使用@Html.DisplayFor(Model=>Model.someProperty)。将这些更改为使用 Model 以外的其他内容,例如:@Html.DisplayFor(x=>x.someProperty) 或在这些帮助程序中将大写的 M 更改为小写的 m

    【讨论】:

    • 如果我使用@Model.AuditDate.Value.ToString("d") Additional information: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
    • @AbuHamzah - 听起来您仍在尝试将其放入 Html.DisplayFor 助手中。不要那样做。另外,您确定它在该行抛出错误,而不是您尝试使用 DisplayFor 帮助器的其他属性吗?
    • 如果我使用 @Model... 我会收到此错误:“模型”与声明 System.Web.Mvc.WebViewPage.Model' 冲突
    • @AbuHamzah 请参阅我更新后答案的最后一段。
    【解决方案2】:

    也许可以试试

    @(Model.AuditDate.HasValue ? Model.AuditDate.ToString("mm/dd/yyyy") : String.Empty)
    

    您也可以使用多种类型的字符串格式,例如 .ToString("dd MMM, yyyy") .ToString("d") 等

    【讨论】:

    • 得到错误:“模型”与声明“System.Web.Mvc.WebViewPage.Model”冲突
    • 如果我使用了@model,它无法识别
    • @AbuHamzah - 我弄错了,它在 HTML 页面中使用时是大写的M,在声明时是小写的m
    • 还是报错,请看我回复汤米的回答
    • No overload for method 'ToString' takes 1 arguments 在我使用 ToString("mm/dd/yyyy") 时抱怨
    【解决方案3】:

    如果您使用DisplayFor,则必须通过DisplayFormat 属性定义格式或使用自定义显示模板。 (预设DisplayFormatString的完整列表可以在here找到。)

    [DisplayFormat(DataFormatString = "{0:d}")]
    public DateTime? AuditDate { get; set; }
    

    或者创建视图Views\Shared\DisplayTemplates\DateTime.cshtml

    @model DateTime?
    @if (Model.HasValue)
    {
        @Model.Value.ToString("MM/dd/yyyy")
    }
    

    不过,这将适用于所有DateTimes,即使是您正在编码时间的那些。如果您希望它仅应用于仅限日期的属性,请在您的属性上使用 Views\Shared\DisplayTemplates\Date.cshtmlDataType 属性:

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

    最后的选择是不使用DisplayFor,而是直接渲染属性:

    @if (Model.AuditDate.HasValue)
    {
        @Model.AuditDate.Value.ToString("MM/dd/yyyy")
    }
    

    【讨论】:

    • 我按照您的建议创建了一个 displayTemplate,当我复制并粘贴您在模板中的代码时,我收到此错误 No overload for method 'ToString' takes 1 arguments
    • 我觉得应该是[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
    • [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")] 为土耳其工作,谢谢
    • @Mac:你是什么意思?他们非常确实工作,但也许只是在您的特定情况下不适用。没有更多信息,我无法说出您的情况。
    • 如果您希望编辑器也使用该格式,请将ApplyFormatInEditMode = true 添加到属性:[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]。这应该很明显,但是当你们都没有时间浪费复制粘贴时,来自智能感知的提示可能会像我的一样从你的鼻子里消失:)
    【解决方案4】:

    请参阅this answer 了解No overload for method 'ToString' takes 1 arguments 错误。

    您不能格式化可为空的 DateTime - 您必须使用 DateTime.Value 属性。

    @Model.AuditDate.HasValue ? Model.AuditDate.Value.ToString("mm/dd/yyyy") : string.Empty
    

    提示:在将其放入视图之前,在标准类中使用智能感知处理这些东西总是有帮助的。在这种情况下,您会收到一个在类中很容易发现的编译错误。

    【讨论】:

    • 如果我使用建议的代码,则会收到此错误'Model' conflicts with the declaration 'System.Web.Mvc.WebViewPage<TModel>.Model'
    【解决方案5】:

    @ChrisPratt 关于使用显示模板的回答是错误的。使其工作的正确代码是:

    @model DateTime?
    
    @if (Model.HasValue)
    {
        @Convert.ToDateTime(Model).ToString("MM/dd/yyyy")
    }
    

    那是因为.ToString() for Nullable<DateTime> doesn't accept Format parameter

    【讨论】:

      【解决方案6】:

      我以这种方式实现了类似的东西:

      1. 使用 TextBoxFor 以所需格式显示日期并使字段只读
      @Html.TextBoxFor(Model => Model.AuditDate, "{0:dd-MMM-yyyy}", new{@class="my-style", @readonly=true})
      

      2.在css中给TextBox赋予零轮廓零边框

      .my-style {
          outline: none;
          border: none;
      }
      

      而且......它完成了:)

      【讨论】:

      • 但是你为什么要那样做呢?
      • 因为其他任何方法都对我不起作用,它为我节省了很多编码。此外,最终结果是只读的并且没有边框,所以它看起来不像一个文本框。
      【解决方案7】:

      对我来说已经足够了

      [DataType(DataType.Date)]
      [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
      public DateTime StartDate { set; get; }
      

      【讨论】:

        【解决方案8】:

        经过一番挖掘,我最终将ThreadCurrentCulture 值设置为在控制器的操作方法中包含CultureInfo("en-US")

        Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); 
        

        这里有一些other options,如果你想在每个视图上都有这个设置。

        关于CurrentCulture属性值:

        此属性返回的CultureInfo 对象,一起 及其关联对象,确定日期的默认格式, 时间、数字、货币值、文本排序顺序、大小写 约定和字符串比较。

        来源:MSDN CurrentCulture

        注意:如果控制器已经使用CultureInfo("en-US") 或类似日期格式为"MM/dd/yyyy" 的控制器运行,则之前的CurrentCulture 属性设置可能是可选的。

        设置CurrentCulture属性后,在视图中添加代码块将日期转换为"M/d/yyyy"格式:

        @{  //code block 
            var shortDateLocalFormat = "";
            if (Model.AuditDate.HasValue) {
               shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("M/d/yyyy");
               //alternative way below
               //shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("d");
            }
        }
        
        @shortDateLocalFormat
        

        @shortDateLocalFormat 变量上方的格式为 ToString("M/d/yyyy") 作品。如果使用ToString("MM/dd/yyyy"),就像我第一次做的那样,那么你最终会得到leading zero issue。也像Tommy 推荐的ToString("d") 一样有效。实际上"d" 代表“Short date pattern”,也可以用于不同的文化/语言格式。

        我猜上面的代码块也可以用一些cool helper method或类似的代替。

        例如

        @helper DateFormatter(object date)
        {
            var shortDateLocalFormat = "";
            if (date != null) {     
                shortDateLocalFormat = ((DateTime)date).ToString("M/d/yyyy");
             }
        
            @shortDateLocalFormat
        }
        

        可以与这个助手调用一起使用

        @DateFormatter(Model.AuditDate)
        

        更新,我发现当使用DateTime.ToString(String, IFormatProvider) 方法时,还有另一种方法可以做同样的事情。使用此方法时,无需使用ThreadCurrentCulture 属性。 CultureInfo("en-US") 作为第二个参数传递 --> IFormatProviderDateTime.ToString(String, IFormatProvider) 方法。

        修改辅助方法:

        @helper DateFormatter(object date)
        {
            var shortDateLocalFormat = "";
            if (date != null) {
               shortDateLocalFormat = ((DateTime)date).ToString("d", new System.Globalization.CultureInfo("en-US"));
            }
        
            @shortDateLocalFormat
        }
        

        .NET Fiddle

        【讨论】:

          【解决方案9】:

          我在控制器上遇到了类似的问题,这对我有用:

          model.DateSigned.HasValue ? model.DateSigned.Value.ToString("MM/dd/yyyy") : ""
          

          “DateSigned”是我模型中的值 该行读取,如果模型值有值,则格式化该值,否则不显示。

          希望有帮助

          【讨论】:

            【解决方案10】:

            我一直在我的代码中使用此更改:

            旧代码:

             <td>
              @Html.DisplayFor(modelItem => item.dataakt)
             </td>
            

            新的:

            <td>
             @Convert.ToDateTime(item.dataakt).ToString("dd/MM/yyyy")
            </td>
            

            【讨论】:

            • ... 和?这是一个答案还是什么?
            • 是的,它只是从主题解决问题。我认为这可能对某人有帮助。
            • 好的,我建议您将“我一直在我的代码中使用此更改”更改为明确说明这是一个解决方案的内容。
            • 简单方便的答案,对我有用,谢谢!!
            • dataakt 是 DateTime 类型的问题?
            【解决方案11】:

            这是获取简单日期字符串的最佳方式:

             @DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()
            

            【讨论】:

            • 这就是这个答案的作用:获取DisplayForHtmlString 输出,将其转换为String,将其解析为DateTime,然后将其格式化为String。在我看来,不必要的复杂。
            【解决方案12】:

            在视图中替换这个:

            @Html.DisplayFor(Model => Model.AuditDate.Value.ToShortDateString())
            

            与:

            @if(@Model.AuditDate.Value != null){@Model.AuditDate.Value.ToString("dd/MM/yyyy")}
            else {@Html.DisplayFor(Model => Model.AuditDate)}
            

            说明:如果 AuditDate 值不为 null,则将日期格式化为 dd/MM/yyyy,否则保持原样,因为它没有值。

            【讨论】:

              【解决方案13】:

              你可以使用转换

               <td>@Convert.ToString(string.Format("{0:dd/MM/yyyy}", o.frm_dt))</td> 
              

              【讨论】:

                【解决方案14】:

                您可以在视图模型上使用 [DisplayFormat] 属性,因为您想将此格式应用于整个项目。

                [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
                public Nullable<System.DateTime> Date { get; set; }
                

                【讨论】:

                • 几乎我所需要的,Visual Studio 为我完成了剩下的工作,我使用了[System.ComponentModel.DataAnnotations.DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd MMM yyyy}")] 然后public DateTimeOffset MyExpirationDate { get; set; }
                猜你喜欢
                • 2016-01-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-06-20
                • 2015-09-23
                • 1970-01-01
                相关资源
                最近更新 更多