在asp.net开发当中,微软给我们很多的控件,让我们非常迅速的开发,并且做出非常理想的效果,并且,效率也是非常不错的,在中小开发中,控件能解决很多的问题,同时,这些控件对我们开发人员来说,应该算是比较隐蔽的,所以我们对他的内部函数和解构都不太了解,所以很多时候也会带来麻烦.
\n
比如我在开发这个blog的时候,演示地址: http://www.shangducms.cn/soundbbg 就会有一些问题..
因为在设计的时候,不是通过前台控件的拖放来实现,而是通过变量来实现的.
比如 template= “<body>…代码</body>”,我认为,这样对变量执行缓存,可以简单的和快速的执行页面,如果我将这个变量放到缓存中,打开后用response.write写出来,可能效率会更高,而不用重复读数据库.(对于数据量大还没研究过,希望有高人指点)
\n
那么写控件好像不太现实,因为就算写<asp:…>是实现不了的..那么用js实现好吗? 我们通过前面的一篇关于效率的文章可以看到,js其实对内存和cpu使用是比较大的,我看了一些html页面的组件,决定自己写一个代码.
\n
这里是变量(调用)的代码
\n
template += “<div class=\\”banner_title\\”>日历</div>”;
template += “<div class=\\”date\\”>”;
template = get_cat(DateTime.Now,template);
template += “</div>”;
我们在函数中,只要获取当前月份的月,和号,datatime可以很方便,再计算已经过了多少天,比如今天是22号,那么1号也可以重载算出来
比如今天是11月22号,那么11月有30天,那么我们找到1号,从1号开始循环到30号 循环30次,而22号高亮就可以了..
\n
protected string get_cat(DateTime time,string tem)
{
int d = time.Day;
int m = time.Month;
int y = time.Year;
int[] a=new int[50];
int now;
int m_long;
int count = 1;
tem += “<table width=\\”100%\\” border=\\”0\\” class=\\”date_style\\” ><tr><td colspan=\\”7\\” class=\\”date_head_time\\”> <- “;
tem += y + “年”+m+”月”;
tem += “-> </td>”;
\n
tem += “<tr><td class=\\”date_head\\”>星期日</td><td class=\\”date_head\\”>星期一</td><td class=\\”date_head\\”>星期二</td><td class=\\”date_head\\”>星期三</td><td class=\\”date_head\\”>星期四</td><td class=\\”date_head\\”>星期五</td><td class=\\”date_head\\”>星期六</td></tr>”;
\n
now = get_day(Convert.ToDateTime(y+”-”+m+”-1″));
m_long = get_month_long(m);
\n
for (int x = 0; x < 50; x++)
{
if (x < now)
{
a[x] = 0;
}
else
if (x > m_long+now-1)
{
a[x] = 0;
}
else
{
a[x] += count;
count++;
}
}
\n
for (int k = 0; k < 6; k++)
{
tem += “<tr>”;
for (int i = k*7; i < k*7+7; i++)
{
if (a[i] != 0)
{
if (a[i].ToString() == DateTime.Now.Day.ToString())
{
tem += “<td class=\\”date_alter\\”>” + a[i] + “</td>”;
}
else
{
tem += “<td class=\\”date_none_alter\\”>” + a[i] + “</td>”;
}
}
else
{
tem += “<td></td>”;
}
}
tem += “</tr>”;
}
tem += “</table>”;
\n
return tem;
}
当然我还需要知道当前的月份的长度当前时间
\n
//获取当前时间的日期,星期几.
protected int get_day(DateTime time)
{
int d = time.Day;
int m = time.Month;
int y = time.Year;
int week;
int weekstr=0;
\n
if (m == 1 || m == 2)
{
m += 12;
y–;
}
week = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 – y / 100 + y / 400) % 7;
\n
switch (week)
{
case 0: weekstr = 1; break;
case 1: weekstr = 2; break;
case 2: weekstr = 3; break;
case 3: weekstr = 4; break;
case 4: weekstr = 5; break;
case 5: weekstr = 6; break;
case 6: weekstr = 7; break;
}
return weekstr;
}
\n
protected int get_month_long(int i)
{
int weekstr=0;
\n
switch (i)
{
case 1: weekstr = 31; break;
case 2: weekstr = 28; break;
case 3: weekstr = 31; break;
case 4: weekstr = 30; break;
case 5: weekstr = 31; break;
case 6: weekstr = 30; break;
case 7: weekstr = 31; break;
case 8: weekstr = 31; break;
case 9: weekstr = 30; break;
case 10: weekstr = 31; break;
case 11: weekstr = 30; break;
case 12: weekstr = 31; break;
}
\n
return weekstr;
}
然后就可以实现一个简单的html日历组件了
\n
在page_load里执行 response.write(template);就可以看到模板了
\n
在编写模板的时候,这里的模板可以想象成一个页面的实现.比如html代码都用response.write形式输出的话,很多控件就无法使用,前一段时间有个朋友一直在苦恼这个,而我也刚好遇到了这个,这只是个简单的实现,当然在效率上还有待加强,不过提出这个算是一个思路罢了.
\n
来源:cnblogs
\n