[原文原码下载(C#)]
[原文原码下载(VB)]
原文发布日期:2007.02.02
作者:Jim Azar
翻译:webabcd
介绍
母板页是asp.net 2.0中的一个非常强大的特性,但是它却不能提供一个实现最基础的针对搜索引擎优化的方法。如果你想你的web页被搜索引擎收录并提高排名,那么你就需要在每一个页都指定一个title和meta标记。本文将说明如何扩展你的asp.net页,以使得在使用母板页的时候你可以直接在你内容页的@Page指令中指定你的meta标签的描述和meta标签的关键字。
背景
当你要针对搜索引擎优化你的web页的时候,设置页的title标签和页的meta描述是其中最重要的因素之一。<title>和meta标签实际上是在每个页的HTML的<head>部分,下面出示一个Rhinoback online backup的例子。
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_Page_18](https://s2.51cto.com/attachment/201007/201007071278477402692.jpg?x-oss-process=image/resize,m_fixed,w_1184)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_Page_19](https://s2.51cto.com/attachment/201007/201007071278477507913.jpg?x-oss-process=image/resize,m_fixed,w_1184)
我不可能让站点的所有页都使用同一个描述,而且我想给每一页都加一个关键字。我们首先想到的解决办法就是在后置代码中插入我们想要的meta标签到每一个页的<head>里,就像如下的做法
C#
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
Dim tag As HtmlMeta = New HtmlMeta()
tag.Name = "description"
tag.Content = "My description for this page"
Header.Controls.Add(tag)
End Sub
在接下来的方案中我们会看到如何通过扩展@Page指令给每一页加上meta标签。
解决方案
我创建了一个继承自System.Web.UI.Page的page基类,并且让我的内容页继承自我的BasePage类。BasePage类包含了在.aspx页中给header控件中增加meta标签的代码,当我们继承了BasePage的之后,这段代码就只需要在一个地方存在,而不用每一页都写一遍。
C#
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
/// <SUMMARY>
/// 为了给内容页增加meta标签而扩展基类
/// </SUMMARY>
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
Imports System.Web.UI
Imports System.Web.UI.HtmlControls
Imports System.Text.RegularExpressions
' 为了给内容页增加meta标签而扩展基类
Public Class BasePage
Inherits Page
Dim _keywords As String
Dim _description As String
' 页将使用这个基类初始化
' 增加一个Init的事件处理
Public Sub New()
AddHandler Init, New EventHandler(AddressOf BasePage_Init)
End Sub
' 页将使用这个基类初始化
' 如果可用则增加meta关键字和meta描述
Sub BasePage_Init(ByVal sender As Object, ByVal e As EventArgs)
If Not String.IsNullOrEmpty(Meta_Keywords) Then
Dim tag As HtmlMeta = New HtmlMeta()
tag.Name = "keywords"
tag.Content = Meta_Keywords
Header.Controls.Add(tag)
End If
If Not String.IsNullOrEmpty(Meta_Description) Then
Dim tag As HtmlMeta = New HtmlMeta()
tag.Name = "description"
tag.Content = Meta_Description
Header.Controls.Add(tag)
End If
End Sub
'获取或设置页的meta关键字
Public Property Meta_Keywords() As String
Get
Return _keywords
End Get
set
' 删掉多余的空格
' 译者注:\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v]。
_keywords = Regex.Replace(value, "\\s+", " ")
End Set
End Property
' 获取或设置页的meta描述
Public Property Meta_Description() As String
Get
Return _description
End Get
Set(ByVal value As String)
' 删掉多余的空格
' 译者注:\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v]。
_description = Regex.Replace(value, "\\s+", " ")
End Set
End Property
End Class
C#
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
![[翻译]在asp.net 2.0中结合母板页使用meta标签(扩展@Page指令)_指令](https://s2.51cto.com/images/editer/InBlock.gif)
Inherits BasePage
Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
End Sub
End Class
CodeFileBaseClass="BasePage"
Title="My home page title"
Meta_Keywords="page directive, extension, dotnet, asp.net"
Meta_Description="This is the meta description for my home page."
%>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<h3>My home page content<h3>
<p>
This is the content on my home page. This page has an appropriate title tag and
also has meta tags for keywords and description that are relative to this page.
The title tag is essential to good search engine optimization and the meta
description is the text that the search engine will display when your
page is listed in search results. The title and meta description should be
set specific to each page and should describe the content of the page.
</p>
</asp:Content>
重点提要
你应该注意到了,在BasePage类里使用了正则表达式。这是因为在你的.aspx里添加描述和关键字的时候可能会是多行,就像下面这个例子似的
CodeFile="is.aspx.cs" Inherits="_is"
CodeFileBaseClass="BasePage"
Title="Effective Customer Feedback Management, Improve Customer Commmunication"
Meta_Keywords="Customer Feedback, Customer Opinion, feedback, opinion,
idea, ideas, idea management, customer feedback management,
product management, product manager, product marketing,
product marketing manager"
Meta_Description="IdeaScope is an on-demand and embedded solution that allows
you to capture, prioritize and centrally manage customer feedback. Make your
customer feedback process more efficient. Save time and involve more
stakeholders without significant cost."
%>
还有另外一个问题就是,Visual Studio 2005不认识Meta_Keywords属性和Meta_Description属性。你如果在@Page指令中指定了这两个属性的话,将会看到这些属性的下面会出现红色的波浪线,VS2005会认为它们是无效的,但实际上它仍然可以正确的编译和运行。如果你不想看到这些错误的话,你可以在Visual Studio的schema里给@Page指令增加如下代码。
<xsd:attribute name="Meta_Description" vs:nonfilterable="true" />
C:\Program Files\Microsoft Visual Studio 8\Common7\Packages\schemas\html\page_directives.xsd
本文示范了如何通过扩展@Page指令使其支持meta关键字和meta描述。你也可以使用相同的方法增加其他的meta标签。原码文件和示例项目包括了c#和vb两种语言。感谢Scott Guthrie的博客文章,Obsure but cool feature in ASP.NET 2.0一文为本解决方案提供了技术支持。
你的评论和建议将会证明本文是受欢迎的