但是相反,这只是工作的经验之谈。
我们在做Web程序的时候,都会出现好几个独立的分站(也就是独立的IIS),像:www.xxx.com 主站,bbs.xxx.com 是论坛,video.xxx.com 是视频,可是如果你已开始没有规划好,那么在后期改动的时候即费时间,又费经力。比如:我们为了网站风格的统一,头部(每一个页头),尾部(版权说明,联系方式。。)之类的,虽然在Vs下我们可以用UserControl定义一个头和尾,在每个页面上拖来拖去,非常的方便,但是每个分站下都有几个同样的UserControl,如果我们后期要对每个分站下的UserControl作相应的修改,然后重新发布,虽然也不是很麻烦,但是如果站点多的话,也是很麻烦,在遇到你没有参加其它模块的编写,以及目录关系不明确,那么这~~~~。
有人会说了,我们可以把头和尾做成js,在没个页都document.write以下,可是如果在头部有相应的登陆判断怎么办?在这在网站优化上,他也不便于搜索引擎的抓取。那怎么办呢?
我在这介绍的办法是做成相应的ServerControl而不是UserControl,假设在每个站点的Bin文件下,都有一个名字为Framwork的dll,这是我们把一些相应公用的文件做到一起的dll,那么我们如果对网站的头和尾作相应的修改的话就不用再动源程序,只是把bin文件夹下相应的dll覆盖掉即可,是不是很方便。
再有一个特别明显的例子是,我们在浏览其它网站的时候,每个页得title会不一样,也可能keywords和Description不一样,我们怎么做这个呢?难道每个页都复制粘贴keywords,description,在Vs2003中我没有看见过HtmlMeta和Page.Title属性,在Vs2005中虽然有这几个属性,难道我们在每个页面都定义HtmlMeta,然后用Page.Header.Control.add一下?那么每个页中都会有相同的代码,那么我们怎么样重构一下我们的代码呢?如果你看过Dz论坛的页面就会发现他其实用了一个PageBase的文件,然后替换掉相应的标签,对于我们不能用Dz这样基于模板机制的地页面怎么办呢?我的解决方案还是想上面介绍的一样,我们只需要,把title,keywords,desc封装到一个类库中就行了,然后对外提供一些公共属性,本来是想解释清楚地,但是一想,代码比什么都有说服力!^ _^
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
using Common;
namespace MyWebControl
{
public class MeteHeader : Literal
{
/// <summary>
/// Title,默认是Web.Config上的appSetting节点的名为Title的值
/// </summary>
private string _strTitle = Function.GetTitle();
/// <summary>
/// 同上
/// </summary>
private string _strKey = Function.GetKeyWords();
/// <summary>
/// 同上
/// </summary>
private string _strDesc = Function.GetDesc();
public string strTitle
{
get { return _strTitle; }
set
{
//如果有相应的Title就。。
if (_strTitle != "")
{
_strTitle = value + "-" + Function.GetTitle();
}
}
}
public string strKey
{
get { return _strKey; }
set
{
if (_strKey != "")
{
_strKey = value + "-" + Function.GetKeyWords();
}
}
}
public string strDesc
{
get { return _strDesc; }
set
{
if (_strDesc != "")
{
_strDesc = value + "-" + Function.GetDesc();
}
}
}
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
writer.Write(GetHeaderText());
}
private string GetHeaderText()
{
StringBuilder sb = new StringBuilder();
sb.Append("<title>");
sb.Append(_strTitle);
sb.Append("</title>");
sb.Append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
sb.Append("<meta name=\"keywords\" content=\"");
sb.Append(_strKey);
sb.Append("\" />");
sb.Append("<meta name=\"description\" content=\"");
sb.Append(_strDesc);
sb.Append("\" />");
return sb.ToString();
}
}
}
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
using Common;
namespace MyWebControl
{
public class MeteHeader : Literal
{
/// <summary>
/// Title,默认是Web.Config上的appSetting节点的名为Title的值
/// </summary>
private string _strTitle = Function.GetTitle();
/// <summary>
/// 同上
/// </summary>
private string _strKey = Function.GetKeyWords();
/// <summary>
/// 同上
/// </summary>
private string _strDesc = Function.GetDesc();
public string strTitle
{
get { return _strTitle; }
set
{
//如果有相应的Title就。。
if (_strTitle != "")
{
_strTitle = value + "-" + Function.GetTitle();
}
}
}
public string strKey
{
get { return _strKey; }
set
{
if (_strKey != "")
{
_strKey = value + "-" + Function.GetKeyWords();
}
}
}
public string strDesc
{
get { return _strDesc; }
set
{
if (_strDesc != "")
{
_strDesc = value + "-" + Function.GetDesc();
}
}
}
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
writer.Write(GetHeaderText());
}
private string GetHeaderText()
{
StringBuilder sb = new StringBuilder();
sb.Append("<title>");
sb.Append(_strTitle);
sb.Append("</title>");
sb.Append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
sb.Append("<meta name=\"keywords\" content=\"");
sb.Append(_strKey);
sb.Append("\" />");
sb.Append("<meta name=\"description\" content=\"");
sb.Append(_strDesc);
sb.Append("\" />");
return sb.ToString();
}
}
}
之后就该调用了,调用就相当简单了如:<xbf:MetaTitle strTitle="",strKey="",strDesc=""></xbf:MetaTitle>如果我们没有赋值的话就默认调用Web.config下的<appSetting>中自己定义的信息了,如果我们闲这样不够“动态”,那么我们可以在后台同样调用MetaTitle1.strTitle属性,这样我们就能控制自如了,是不是很方便。
在来到这个公司的时候,因为我有工作经验,因为我用类库,所以一些同事问我为什么写这么多的类库,把代码直接写到Web程序下不就行了,改得时候还容易,我说对于一些项目享用的要做成类库,对于独立你可以写在程序中,如果对于一个截取字符串的函数,好几个人好几个版本那么在后期维护的时候,你就能感觉到那种方法好了。最重要的是在程序升级的时候,比如我们的程序时用2003开发的,现在要升级的2005,如果没有类库的话,难道我们对于一些不变得的代码快重新复制粘贴?那么工作量可想而知了,如果是类库的话,公用接口不变,变得的只是页面的工作!
以上是个人的工作经验之谈,如果有不对的地方,或者更好的办法,请在下边留言,共同学习,共同进步