mvc - c# - aspx => 我有一个DDL(下拉列表),它显示表中的日期,DDL用于过滤表中显示的项目。表工作,过滤器工作,唯一的丑陋的事情是过滤器显示日期的时间:02/12/2010 12:00:00:00:00AM或类似的东西,我试图把时间减少为它来自表格,但如果有更好的方法,请帮助, 我尝试了以下内容:在controller => string.format:告诉我它不是一个有效的sql什么.... ToString(“MM / dd / yyyy”,n)告诉我同样的,我也试过转换(varchar(12),n,101)思考它可能需要sql服务器,但它也不喜欢,我甚至尝试在视图文件中添加一个格式到DDL键,并且正如我所料,它说它无法找到该键的任何内容。
// target date -- this code is from my controller
if ((Request.Form["TARGET_DATE"] != null) && Request.Form["TARGET_DATE"] != "")
{
TargetDate = Request.Form["TARGET_DATE"];
ViewData["TARGET_DATE"] = new SelectList((from n in _db.ACTION_PLANs select n).ToList(), "TARGET_DATE", "TARGET_DATE", TargetDate);
predicate = predicate.And(p => p.TARGET_DATE == Convert.ToDateTime(TargetDate));
}
else
{
TargetDate = null;
ViewData["TARGET_DATE"] = new SelectList((from n in _db.ACTION_PLANs select n).ToList(), "TARGET_DATE", "TARGET_DATE");
}
有没有办法格式化'n'跟随'MM / dd / yyyy'?或者如何才能做到这一点?或者我做错了什么? .....谢谢
答案 0 :(得分:2)
你应该理解的是,SQL和CLR DateTime类型实际上都存储为一个整数,其中包含相对于“epoch”的“ticks”数。因此,时间与这一级别的日期不可分割;表示日期和时间的值只能被一天中的刻度数整除。没有CLR类型只是一个日期。
要“忽略”将其转换为字符串的时间,您可以使用DateTime的ToString()重载:Convert.ToDateTime(TargetDate).ToString("MM/dd/yyyy");
但是,除非您已经对p.TARGET_DATE执行了此操作,否则您的比较可能会失败
答案 1 :(得分:0)
我认为您没有看到您真正获得的数据类型。 “02/12/2010 12:00:00:00:00AM”的输出看起来像somethign在一个类型的幕后调用.ToString()最终解除对DateTime数据类型的打开。
根据您在说明中的限制,尝试
((DateTime)ViewData["TARGET_DATE"])).ToString("MM/dd/yyyy")
也许你很幸运,这很有效。或尝试一些矫枉过正:
DateTime.Parse(ViewData["TARGET_DATE"].ToString()).ToString("MM/dd/yyyy")
无论如何,两个示例都是非常糟糕的代码,只是为了让您开始解决问题(即,在第二个示例中使用TryParse(),或者在第一个示例中使用“as”关键字)。在已清理的版本中,使用完整的错误检查,包括检查null / empty / DBNull.Value值。
在这两种情况下,关键是要弄清楚你得到的真实数据类型(也许是对象?),然后转换/转换它,这样你就可以按照你真正想要的格式化它。
答案 2 :(得分:0)
从数据库出来的“丢弃时间”只会将时间分量设置为0 - 即午夜或12:00:00.000 AM。
您需要在表示层中对格式进行分类,以便仅表示日期。
答案 3 :(得分:0)
感谢每一位帮助过的人......我终于能够在我的下拉列表(DDL)中没有时间显示日期。这就是我做到的。
if ((Request.Form["TARGET_DATE"] != null) && Request.Form["TARGET_DATE"] != "")
{
TargetDate = Request.Form["TARGET_DATE"];
IEnumerable<SelectListItem> tarDate =
from n in _db.ACTION_PLANs
select new SelectListItem
{
Selected = (TargetDate == n.TARGET_DATE.Date.ToString()),
Text = string.Format("{0:MM/dd/yyyy}", n.TARGET_DATE.Date),
Value = n.TARGET_DATE.ToString(),
};
ViewData["TARGET_DATE"] = tarDate;
predicate = predicate.And(p => p.TARGET_DATE.ToString() == TargetDate);
我希望这也有助于其他有同样问题的人。
答案 4 :(得分:0)
.ToString
方法接受可选的通用格式参数。
要删除输出字符串中的时间组件,您可以使用.ToString("MM/dd/yyyy")
。
示例强>
在以下示例中,我实现了以下目标:
根据TARGET_DATE
会话参数是否存在来设置TargetDate属性。
创建DateTime的初始List,并使用基于linq查询的TARGET_DATE
会话参数的结果填充它。
我创建了一个新的字符串列表并复制了日期时间列表,并应用了所需的格式。
然后将字符串列表重新用作下拉列表的数据源。
我不确定基于TARGET_DATE
会话参数的设置变量predicate
的代码行的目的。我留下它以防周围的代码需要它。
<强>代码强>
编辑了提供的代码后,请使用以下修订代码:
bool IsDateset = (Request.Form["TARGET_DATE"] != null) && Request.Form["TARGET_DATE"] != "";
TargetDate = IsDateset ? Request.Form["TARGET_DATE"] : null;
List<DateTime> TargetDatesAsDateTime = null;
if (IsDateset)
{
List<DateTime> TargetDatesAsDateTime = new SelectList((from n in _db.ACTION_PLANs select n).ToList(), "TARGET_DATE", "TARGET_DATE", TargetDate);
predicate = predicate.And(p => p.TARGET_DATE == Convert.ToDateTime(TargetDate)); // I'm unsure as to the purpose of this line of code. I left it in in case the surrounding code requires it.
}
else
{
List<DateTime> TargetDatesAsDateTime = new SelectList((from n in _db.ACTION_PLANs select n).ToList(), "TARGET_DATE", "TARGET_DATE");
}
List<string> TargetDateAsString = new List<string>();
if(TargetDatesAsDateTime != null || TargetDatesAsDateTime.Count > 0)
{
foreach(DateTime d in TargetDatesAsDateTime)
{
string s = d.ToString("dd/MM/yyyy");
TargetDateAsString.Add(s);
}
}
ViewData["TARGET_DATE"] = TargetDatesAsString;
我会留给您根据您的喜好缩小和格式化代码。