我有两个用VB.NET编写的函数:
1)第一个函数(称为GetValues())通过存储过程将SQL数据库中的值作为列表返回。其中一个字段是DateTimeSubmitted。所有这些数据都使用转发器控件显示在我的网页上。它工作正常。
2)我创建的第二个函数(称之为NiceDate())将DateTimeSubmitted更改为一个漂亮的日期,例如“一分钟前”或“昨天”。
我的问题是我不知道哪个是进程转换的最佳部分(在数据提取或页面加载等方面)或实际上如何进行转换。
我在页面加载中尝试过一些东西,并开始考虑使用FOR EACH循环进行转换,但到目前为止还没有骰子。
我是在正确的轨道上还是有更简单的方法?
答案 0 :(得分:3)
您可以处理转发器的ItemDataBound Event。从那里你可以使用FindControl来获取控件(也许是一个标签?)并使用你的NiceDate()逻辑相应地更新它。
与上述链接中的代码类似,您可以执行以下操作:
编辑:更新为VB.NET
Sub myRepeater_ItemDataBound(Sender As Object, e As RepeaterItemEventArgs)
' This event is raised for the header, the footer, separators, and items.
' Check the type: operate on Items and Alternating Items only.
If (e.Item.ItemType = ListItemType.Item) Or (e.Item.ItemType = ListItemType.AlternatingItem) Then
' Get a reference to the date label then update its value
Dim lblDate As Label = CType(e.Item.FindControl("lblDate"), Label)
lblDate.Text = NiceDate(lblDate.Text)
End If
End Sub
答案 1 :(得分:1)
在我看来,这是严格的视图逻辑,所以它应尽可能靠近视图处理。我无法想出一个聪明的方法,但这应该给你一个开始。还有更多的工作要做,错误处理,返回值的正确基数(小时与小时),但它是一个概念证明。 :)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DT
{
class Program
{
static void Main(string[] args)
{
var dt1 = DateTime.Now - TimeSpan.FromDays(1);
var dt2 = DateTime.Now - TimeSpan.FromHours(2);
var dt3 = DateTime.Now - TimeSpan.FromMinutes(10);
Console.WriteLine(FriendlyDate(dt1));
Console.WriteLine(FriendlyDate(dt2));
Console.WriteLine(FriendlyDate(dt3));
Console.ReadLine();
}
private static string FriendlyDate(DateTime dt)
{
var cur = DateTime.Now;
var ts = cur - dt;
return FriendlyDate(ts);
}
private static string FriendlyDate(TimeSpan ts)
{
string retVal = String.Empty;
if (ts.Days > 0)
{
retVal = String.Format("{0} day(s) ago.", ts.Days);
}
else if (ts.Hours > 0)
{
retVal = String.Format("{0} hours(s) ago.", ts.Hours);
}
else
{
retVal = String.Format("{0} minute(s) ago.", ts.Minutes);
}
return retVal;
}
}
}
答案 2 :(得分:1)
这样的转换可以在您的业务/服务层中处理,无论您的数据访问层和表示层之间是什么。
或者,如果这是严格用于演示,您可以在代码隐藏中创建一个方法并使用您的数据类调用它以获得在项目数据绑定事件中显示的适当日期。
答案 3 :(得分:1)
如果您使用的是.Net 3.5,并且无论如何您使用绑定在UI元素中显示数据库值,那么您可以创建“转换器”。这只是为了这个目的,或者即使你不想创建转换器,如果你正在使用属性类,那么你可以在属性get语句之前转换它。