如何在ASP.NET MVC 3中以特定格式呈现DateTime?

Sla*_*uma 117 asp.net asp.net-mvc asp.net-mvc-3

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

我试过这个......

@Html.DisplayFor(modelItem => item.MyDateTime.ToLongDateString())
Run Code Online (Sandbox Code Playgroud)

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

@{var val = item.MyDateTime.ToLongDateString();
  Html.DisplayFor(modelItem => val);
}
Run Code Online (Sandbox Code Playgroud)

...它不会抛出异常,但渲染的输出为空(尽管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 "";
}
Run Code Online (Sandbox Code Playgroud)

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

Dar*_*rov 172

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

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

在你看来:

@Html.EditorFor(x => x.MyDate)
Run Code Online (Sandbox Code Playgroud)

或者,为了显示价值,

@Html.DisplayFor(x => x.MyDate)
Run Code Online (Sandbox Code Playgroud)

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

@Html.TextBox("MyDate", Model.MyDate.ToLongDateString())
Run Code Online (Sandbox Code Playgroud)

  • @NickLarsen,不,它是每个视图的一个视图模型.这是因为人们犯了这样的错误:*我如何在一个控制器动作中排除某些属性而不在其他控制器动作中?*在SO上是如此常见. (5认同)
  • @Slauma,怎么样`@ Html.DisplayFor(x => x.MyDateTime)`.@NickLarsen这就是应该使用视图模型的原因.在我的例子中,我用这个属性装饰视图模型,并且视图已经绑定到给定视图,这就是它的目的. (2认同)

Nic*_*sen 159

如果您只想显示具有特定格式的日期,只需致电:

@String.Format(myFormat, Model.MyDateTime)
Run Code Online (Sandbox Code Playgroud)

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

@model System.DateTime

@Model.ToShortDateString()
Run Code Online (Sandbox Code Playgroud)

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

@Html.DisplayFor(m => m.MyDateTime, "ShortDateTime")
Run Code Online (Sandbox Code Playgroud)

  • 如果类型是"DateTime?" 而不是"DateTime"(@model DateTime?)... ciplay模板将处理可空或不可空的日期时间.该文件的名称应保留为"DateTime.cshtml". (3认同)

小智 26

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

@String.Format("{0:d}", model.CreatedOn)
Run Code Online (Sandbox Code Playgroud)

或者在foreach循环中

@String.Format("{0:d}", item.CreatedOn)
Run Code Online (Sandbox Code Playgroud)

  • @PaulTyng这个答案对我来说比接受的答案更清楚,odesuk实际上在第一个参数中显示了格式,作为一个新手,帮助我. (2认同)

Ste*_*ven 25

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

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

否则,在填充TextBox或Editor时,您可以像@Darin建议一样,使用属性修饰[DisplayFormat]属性.


ata*_*ini 9

如果所有DateTime类型的呈现方式与使用自定义DateTime显示模板的方式相同.

在Views文件夹中,在控制器特定视图文件夹下或"共享"文件夹下创建名为"DisplayTemplates"的文件夹(这些工作类似于partials).

在里面创建一个名为的文件DateTime.cshtml,DateTime其中@model包含您想要呈现日期的代码:

@model System.DateTime
@Model.ToLongDateString()
Run Code Online (Sandbox Code Playgroud)

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

@Html.DisplayFor(mod => mod.MyDateTime)
Run Code Online (Sandbox Code Playgroud)

只要遵循将其添加到"DisplayTemplates"文件夹并将文件命名为与您显示的类型相匹配的惯例,MVC将自动使用它来显示您的值.这也适用于使用"EditorTemplates"编辑场景.

这里有一些关于模板的更多信息.


phi*_*n5d 7

我的首选是将格式详细信息保留在视图中而不是视图模型中.所以在MVC4/Razor中:

@Html.TextBoxFor(model => model.DateTime, "{0:d}");
Run Code Online (Sandbox Code Playgroud)

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

然后我有一个JQuery datepicker绑定到它,并把日期作为一个不同的格式... doh!

看起来我需要将datepicker的格式设置为相同的格式.

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

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

这里有一个很糟糕的部分:.net和datepicker的格式不匹配,所以需要hackery:

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

这有点弱,但应该涵盖很多案例.