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
    {
        /// <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" })
参考链接: 点击打开链接

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值