母板页是asp.net 2.0中的一个非常强大的特性,但是它却不能提供一个实现最基础的针对搜索引擎优化的方法。如果你想你的web页被搜索引擎收录并提高排名,那么你就需要在每一个页都指定一个title和meta标记。本文将说明如何扩展你的asp.net页,以使得在使用母板页的时候你可以直接在你内容页的@Page指令中指定你的meta标签的描述和meta标签的关键字。
背景
当你要针对搜索引擎优化你的web页的时候,设置页的title标签和页的meta描述是其中最重要的因素之一。<title>和meta标签实际上是在每个页的HTML的<head>部分,下面出示一个Rhinoback online backup的例子。
<head>
<title>
Rhinoback Professional Secure Online Backup Services for Small and Medium Business - SMB
</title>
<meta name="description" content="Professional Online Backup Services.
Rhinoback provides robust backup functionality at affordable prices.
Premium features, premium services, low prices. Get the most for
your money with Rhinoback!" />
<meta name="keywords" content="backup, online backup, secure backup, cheap backup,
free backup, offsite backup,internet backup, secure files, offsite data storage,
privacy, security, features, low prices, premium service, remote backup" />
</head>
<body>
<!-- page content -->
</body>
</html>
<title>标签的文本显示在浏览器的顶端。从下面的例子中可以看到<title>在IE中的显示
当你的页被搜索引擎收录的时候,meta描述的文本则在搜索引擎的列表中显示。下面的例子来自google。带下划线的标题的下面的文本就来自页的meta 描述标签。如果没有meta描述标签,那你的页在搜索引擎的列表中将显示为你的页上的某一处的文本。指定你的每一个页的描述文本要比把这些事情交给搜索引擎做好的多。
母板页已经被证明是asp.net 2.0中非常有用的一个特性。本文不是来说明母板页的细节或是如何实现它,因为这样的文章太多了。当我们在母板页中使用了<head>的话,那么母板页下的所有内容页都将自动的包括这个<head>。幸运的是开发人员可以在内容页中直接在@Page指令中修改title属性来修改内容页的title。
上面的@Page指令说明了这是一个使用了母板页的内容页。如果你要指定meta标签的话,应该在内容页中指定。你可以看到@Page指令中有一个 “Description”属性,但是它不能在你的页上创建meta描述标签。事实上,即使你指定了“Description”属性,最后也会被忽略掉而不做任何事的。
我不可能让站点的所有页都使用同一个描述,而且我想给每一页都加一个关键字。我们首先想到的解决办法就是在后置代码中插入我们想要的meta标签到每一个页的<head>里,就像如下的做法
C#
{
HtmlMeta tag = new HtmlMeta();
tag.Name = "description";
tag.Content = "My description for this page";
Header.Controls.Add(tag);
}
VB
Dim tag As HtmlMeta = New HtmlMeta()
tag.Name = "description"
tag.Content = "My description for this page"
Header.Controls.Add(tag)
End Sub
这种解决方法有一个问题,就是页的标题,meta描述,meta关键字都是相互关联的,所以我们想的是最好让标题和描述在同一个文件中指定。在 Page_Load方法里确实可以很简单的在.aspx页中加入一个<script>标签,但是我想要一个更简单的设置和检查每一页标签的解决方案。
在接下来的方案中我们会看到如何通过扩展@Page指令给每一页加上meta标签。
解决方案
我创建了一个继承自System.Web.UI.Page的page基类,并且让我的内容页继承自我的BasePage类。BasePage类包含了在.aspx页中给header控件中增加meta标签的代码,当我们继承了BasePage的之后,这段代码就只需要在一个地方存在,而不用每一页都写一遍。
C#
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Text.RegularExpressions;
/**//// <SUMMARY>
/// 为了给内容页增加meta标签而扩展基类
/// </SUMMARY>
public class BasePage : Page
{
private string _keywords;
private string _description;
// 构造函数
// 增加一个Init的事件处理
public BasePage()
{
Init += new EventHandler(BasePage_Init);
}
// 页将使用这个基类初始化
// 如果可用则增加meta关键字和meta描述
void BasePage_Init(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(Meta_Keywords))
{
HtmlMeta tag = new HtmlMeta();
tag.Name = "keywords";
tag.Content = Meta_Keywords;
Header.Controls.Add(tag);
}
if (!String.IsNullOrEmpty(Meta_Description))
{
HtmlMeta tag = new HtmlMeta();
tag.Name = "description";
tag.Content = Meta_Description;
Header.Controls.Add(tag);
}
}
/**//// <SUMMARY>