@ Html.DisplayFor - DateFormat(" mm / dd / yyyy")

时间:2015-01-23 16:57:53

标签: asp.net asp.net-mvc

我有以下剃刀代码,我想要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个参数

14 个答案:

答案 0 :(得分:127)

如果您使用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")
}

这将适用于所有DateTime,甚至是你编码时间的那些。如果您希望它仅适用于仅限日期的属性,请在您的媒体资源上使用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")
}

答案 1 :(得分:18)

如果您只是输出该模型属性的值,则不需要DisplayFor html助手,只需使用proper string formatting直接调用它。

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

应输出

Audit Date: 1/21/2015

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

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

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

答案 2 :(得分:5)

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

@model DateTime?

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

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

答案 3 :(得分:3)

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

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

    2.在CSS中将零轮廓零边框提供给TextBox。

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

    并...... ......完成了:)

答案 4 :(得分:2)

对我而言,使用

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

答案 5 :(得分:2)

经过一番挖掘后,我最终设置了Thread的{​​{3}}值,以便在控制器的操作方法中设置CurrentCulture

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

如果您希望在每个视图上都设置此设置,则可以使用以下CultureInfo("en-US")

关于CurrentCulture属性值:

  

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

来源:CultureInfo

注意:如果控制器已在CurrentCulture或类似日期格式为CultureInfo("en-US")的情况下运行,则上一个"MM/dd/yyyy"属性设置可能是可选的。< / p>

设置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"),就像我先做的那样,那么你最终会得到MSDN CurrentCulture。也像leading zero issue ToString("d")推荐的那样。实际上"d"代表 Tommy ,也可以用于不同的文化/语言格式。

我猜上面的代码块也可以替换为某些“Short date pattern”或类似代码。

例如

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

    @shortDateLocalFormat
}

可以与此助手调用一起使用

@DateFormatter(Model.AuditDate)

更新,我发现在使用cool helper method方法时,还有其他方法可以做同样的事情。使用此方法时,无需使用Thread的{​​{1}}属性。 CurrentCulture作为第二个参数传递 - &gt; DateTime.ToString(String, IFormatProvider)CultureInfo("en-US")方法。

修改的辅助方法:

DateTime.ToString(String, IFormatProvider)

IFormatProvider

答案 6 :(得分:2)

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

旧代码:

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

新:

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

答案 7 :(得分:2)

要在整个项目中应用此格式,可以在视图模型上使用[ DisplayFormat ]属性。

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

答案 8 :(得分:0)

也许只是尝试

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

你也可以使用很多类型的字符串格式 .ToString(“dd MMM,yyyy”) .ToString(“d”)等

答案 9 :(得分:0)

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

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

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

希望有所帮助

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

在视图中替换为:

def rabbit(rocks, jumps=0):
    max_jump = max(element for element in rocks if element <= 50)
    last = rocks[-1]
    if max_jump >= last:
        return jumps + 1

    else:
        return rabbit([rock - max_jump for rock in rocks if rock > 50], jumps + 1)

print(rabbit([32, 46, 70, 85, 96, 123, 145]))
print(rabbit([30, 70, 75, 120, 160, 170, 180, 190, 200, 246, 258]))

使用:

3
7

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

答案 12 :(得分:0)

您可以使用Convert

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

答案 13 :(得分:-1)

请参阅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
  

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