C#下,展示数据库中的date数据类型的问题

项目开发中(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
    {
        /// 
        /// 显示字段的名称DisplayName的值
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        public static MvcHtmlString MyDate(this HtmlHelper html, Expression> 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" })
参考链接: 点击打开链接

你可能感兴趣的:(C#下,展示数据库中的date数据类型的问题)