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


88

我有以下想要具有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个参数

Answers:


161

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

[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")
}

我已经按照您的建议创建了displayTemplate,当我复制并粘贴模板中的代码时,出现此错误No overload for method 'ToString' takes 1 arguments
Nick Kahn 2015年

3
我认为应该是[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]

[DisplayFormat(DataFormatString =“ {0:dd / MM / yyyy}”)]为土耳其工作了谢谢
zapoo 2016年

@Mac:你是什么意思?它们确实可以工作,但也许在您的特定情况下不起作用。没有更多信息,我无法说出您的情况。
克里斯·普拉特

如果您希望编辑器也使用该格式,请添加ApplyFormatInEditMode = true到属性:中[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]。它应该很明显,但是当您全都没时间去浪费复制粘贴时,智能感知的暗示可能会像您的发现一样越过您的鼻子:)
Heki

19

如果您只是输出那个model属性的值,则不需要DisplayForhtml helper,只需使用正确的字符串格式直接调用它即可。

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

应该输出

Audit Date: 1/21/2015

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

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

谷歌搜索您得到的错误将提供此答案,这表明该错误是由于在Html帮助器中使用单词Model引起的。例如,使用@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.
Nick Kahn

@AbuHamzah-听起来您仍在尝试将其放入Html.DisplayFor帮助器中。不要那样做 另外,您确定它会在该行上引发错误,而不是您尝试使用该DisplayFor辅助程序的其他属性吗?
汤米

如果我使用@Model...了此错误,则此错误:'Model'与声明System.Web.Mvc.WebViewPage <TModel> .Model冲突'
Nick Kahn,

@AbuHamzah请参阅更新后的答案中的最后一段。
汤米

11

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

旧代码:

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

新:

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

...和?这是答案还是什么?
Maciej Jureczko

是的,这仅仅是从主题解决问题。我认为这可能对某人有所帮助。
Piotr Mirek

好的,我建议您将“我一直在代码中使用此更改”更改为具体说明这是一种解决方案。
Maciej Jureczko

简单方便的答案,为我工作谢谢!
扫描器


5

我用这种方式实现了类似的事情:

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

2.在CSS中为TextBox提供零轮廓零边框

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

然后......完成了:)


1
但是为什么要那样做呢?
CodeCaster

因为其他任何方法都不适合我,并且为我节省了很多代码。此外,最终结果为只读且没有边框,因此它看起来不像文本框。
阿克沙特

4

对我来说,足以使用

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

4

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

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

2

经过一番挖掘之后,我最终将ThreadCurrentCulture值设置为在控制器的操作方法中具有CultureInfo(“ en-US”)

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

如果要在每个视图上都具有此设置,则可以使用以下其他选项

关于CurrentCulture财产价值:

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

资料来源:MSDN CurrentCulture

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

设置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变量是用Works格式化的ToString("M/d/yyyy")。如果ToString("MM/dd/yyyy")使用了,就像我首先做的那样,那么您最终将遇到前导零问题。也像汤米 推荐的ToString("d")作品一样。实际上"d"代表“短日期模式”,也可以用于不同的文化/语言格式。

我猜上面的代码块也可以用一些很酷的辅助方法或类似方法代替。

例如

@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")作为第二个参数-> IFormatProvider传递给DateTime.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小提琴


1

也许尝试一下

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

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


收到错误:“模型”与声明“ System.Web.Mvc.WebViewPage <TModel> .Model”发生冲突
Nick Kahn

如果我使用@model它就不能识别
Nick Kahn

@AbuHamzah-我错了,M在HTML页面中使用时大写,m声明时小写。
汤米

仍然出现错误,请参阅我回复汤米的答案
Nick Kahn 2015年

1
No overload for method 'ToString' takes 1 arguments我使用时抱怨ToString("mm/dd/yyyy")
Nick Kahn 2015年

1

在视图中替换为:

@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,否则将其保持不变,因为它没有值。


0

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

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

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

希望能有所帮助


0

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

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

这是此答案的作用:将HtmlString输出取为DisplayFor,将其转换为a String,将其解析为a DateTime,然后将其格式化为a String。我认为不必要的复杂。
异端猴子

0

您可以使用转换

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

-1

请参阅有关错误的此答案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'
Nick Kahn 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.