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为一个自定义的扩展方法DateTime和DateTime?:
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)
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)
小智 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)
Ste*_*ven 25
我使用以下方法内联格式并从模型中显示日期属性.
@Html.ValueFor(model => model.MyDateTime, "{0:dd/MM/yyyy}")
Run Code Online (Sandbox Code Playgroud)
否则,在填充TextBox或Editor时,您可以像@Darin建议一样,使用属性修饰[DisplayFormat]属性.
如果所有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"编辑场景.
我的首选是将格式详细信息保留在视图中而不是视图模型中.所以在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)
这有点弱,但应该涵盖很多案例.
| 归档时间: |
|
| 查看次数: |
210618 次 |
| 最近记录: |