我想为DateTime属性创建一个DisplayTemplate.
例如,我有以下模型:
public class MyModel
{
[DataType(DataType.Date)]
public DateTime? Date { get; set; }
[DataType(DataType.Time)]
public DateTime? TimeFrom { get; set; }
[DataType(DataType.Time)]
public DateTime? TimeUntil { get; set; }
[DataType(DataType.DateTime)]
public DateTime? SomeDate { get; set; }
}
在我看来:
@Html.DisplayFor(x => x.Date) // Expected output: 13.11.2015
@Html.DisplayFor(x => x.TimeFrom) // Expected output: 08:00
@Html.DisplayFor(x => x.TimeUntil) // Expected output: 12:00
@Html.DisplayFor(x => x.SomeDate) // Expected output: 15.11.2015 08:55
在我的DisplayTemplate中,我有以下代码:
@using System.ComponentModel.DataAnnotations
@using System.Reflection
@model DateTime?
@{
var type = Model.GetType();
var attribute = type.GetCustomAttribute(typeof (DataTypeAttribute)) as DataTypeAttribute;
}
@if (Model != null)
{
if (attribute != null)
{
if (attribute.DataType == DataType.Date)
{
@Model.Value.ToShortDateString()
}
if (attribute.DataType == DataType.Time)
{
@Model.Value.ToShortTimeString()
}
else
{
@Model.Value
}
}
else
{
@Model.Value
}
}
不幸的是,找不到DataTypeAttribute.
找到的唯一CustomAttributes是Serializable和__DynamicallyInvokable-Attributes.
在模型中,我们总是有DateTimes的DataType属性.
如何找到当前的DataTypeAttribute?
最佳答案 请注意,您正在搜索分配给DateTime的属性?键入本身,而不是MyModel类的属性.没有在这些中找不到这个数据模型属性.
所有内置数据模型属性都填充了ViewData.ModelMetadata对象,因此您应该能够使用以下方法访问数据类型的名称:
ViewData.ModelMetadata.DataTypeName
不幸的是,由于某种原因,这是一个字符串,所以你可能需要将它与DataType.Date.ToString()之类的东西进行比较.
有关其他模型元数据属性的更多信息,请参见ModelMetadata class description.