项目开发中(ASP.NET MVC框架开发)遇到的一个问题是,数据库中存放了date类型的数据,在前台页面显示的时候(利用DisplayFor()方法))总会带着时间值,现在想仅仅显示日期,不要时间值。
这个问题出现的原因是:C#本身只有DateTime数据类型,没有单纯的date类型,所以你从数据库中读出的date类型在填入DateTime类型的时候,都会填入默认全为0的时间值,当你前台显示的时候,实际上调用DateTime类型的ToString()方法,所以总会显示时间值。最直观的解决方法就是重载ToString方法为ToString("yyyy-MM-dd"),直接可以把DateTime格式化为日期格式的字符串。但是这种解决方法对于DateTime?类型是不能用的,因为DateTime?类型并不能调用ToString("yyyy-MM-dd")方法!所以解决的方法就是要想办法把DateTime?转化为DateTime类型。这里就需要用到
System.Convert.ToDateTime(string date)
这个方法的好处是:如果参数date是为null的话,这个方法会返回一个默认的时间,具体的值是“0001/1/1 0:00:00"(实际上一个为null的DateTime?类型可以调用ToString()方法,会返回空字符串)。转化的代码很简单:
DateTime? dt = null;
DateTime tmpDate = Convert.ToDateTime(dt);
然后可以正常的调用ToString("yyyy-MM-dd")方法了。
下面是我用扩展方法的具体写法
public static class StaticExtension
{
public static string MyDateNullable(this DateTime? dt)
{
DateTime tmp = Convert.ToDateTime(dt);
return tmp.ToString("yyyy-MM-dd");
}
public static string MyDateNotNull(this DateTime dt)
{
return dt.ToString("yyyy-MM-dd");
}
}
既然使用了扩展方法,一个更为彻底的方法就是扩展原先的DisplayFor()方法,专门处理针对DateTime和DateTime?类型的显示问题,彻底按照自己的需要来定义。具体的代码如下:
public static class MyExtension
{
/// <summary>
/// 显示字段的名称DisplayName的值
/// </summary>
/// <typeparam name="TModel"></typeparam>
/// <typeparam name="TValue"></typeparam>
/// <param name="html"></param>
/// <param name="expression"></param>
/// <returns></returns>
public static MvcHtmlString MyDate<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
//DateTime类型
if (typeof(TValue) == typeof(DateTime))
{
if (metadata.ModelType == typeof(DateTime))
{
DateTime dt = (DateTime)metadata.Model;
return MvcHtmlString.Create(dt.ToString("yyyy-MM-dd"));
}
return MvcHtmlString.Create("Oops,not a DateTime");
}
//DateTime?类型
else if (typeof(TValue) == typeof(DateTime?))
{
if (metadata.ModelType == typeof(DateTime?))
{
if (metadata.Model == null)
return MvcHtmlString.Create("Empty.");
else
{
DateTime dt = Convert.ToDateTime(metadata.Model);
return MvcHtmlString.Create(dt.ToString("yyyy-MM-dd"));
}
}
return MvcHtmlString.Create("Oops,not a DateTime");
}
else
{
return MvcHtmlString.Create("Oops,not a DateTime");
}
}
}
以上的方法实际上都是绕个圈解决问题,Goole一下可以发现超级简单的方法,因为MVC框架本身就为我们提供了解决方法,一共有两种:
方法一:
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime StartDate { get; set; }
方法二:
@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}", new { @class="input-large" })
参考链接:
点击打开链接