Biztos más is találkozott már azzal a problémával, hogy a kereső optimalizációban alul/túl értékelt (mindenki ízlése szerint választhat) metaadatokat nem is olyan egyszerű az ASP.NET oldalhoz adni, ha MasterPage-t használunk (az esetek kb 90%) és oldalanként eltérő metaadatot kellene kezelni.
A .Net 4 alatt már megoldották a problémát, a Page direktíva okosításával, de a korábbi verziókban (amelyek még rengeteg helyen futnak) ez még gondot okoz.
Mi lehet a megoldás?
1) Adjuk a master page head szakaszában a következőket:
<asp:ContentPlaceHolder id="MetaDescription" runat="server" Visible="false"></asp:ContentPlaceHolder>
<asp:ContentPlaceHolder ID="MetaKeywords" runat="server" Visible="false"></asp:ContentPlaceHolder>
2) Ennyivel még nem hagyjuk békén a master page-t! Váltsunk kód nézetre, és írjuk a következő kis laza kódot.
Private description As HtmlMeta
Private keywords As HtmlMeta
Protected Overrides Sub OnInit(ByVal e As EventArgs)
MyBase.OnInit(e)
'Esemény kezelők létrehozása
AddHandler Me.MetaDescription.Load, New EventHandler(AddressOf MetaDescriptionLoad)
AddHandler Me.MetaKeywords.Load, New EventHandler(AddressOf MetaKeywordsLoad)
AddHandler Me.Page.LoadComplete, New EventHandler(AddressOf PageLoadComplete)
End Sub
'Felolvassuk a PlaceHolderbe megadott szöveget
Private Function GetContent(ByVal holder As ContentPlaceHolder) As String
If holder Is Nothing OrElse holder.Controls.Count = 0 Then
Return String.Empty
End If
Dim control As LiteralControl = TryCast(holder.Controls(0), LiteralControl)
If control Is Nothing OrElse String.IsNullOrEmpty(control.Text) Then
Return String.Empty
End If
Return control.Text.Trim()
End Function
'Description Meta adatok összeállítása
Private Sub MetaDescriptionLoad(ByVal sender As Object, ByVal e As EventArgs)
Dim content As String = Me.GetContent(Me.MetaDescription)
If String.IsNullOrEmpty(content) Then
Return
End If
Me.description = New HtmlMeta()
Me.description.Name = "description"
Me.description.Content = content
End Sub
'Keywords adatok összeállítása
Private Sub MetaKeywordsLoad(ByVal sender As Object, ByVal e As EventArgs)
Dim content As String = Me.GetContent(Me.MetaKeywords)
If String.IsNullOrEmpty(content) Then
Return
End If
Me.keywords = New HtmlMeta()
Me.keywords.Name = "keywords"
Me.keywords.Content = content
End Sub
'Page-hez hozzáadása
Private Sub PageLoadComplete(ByVal sender As Object, ByVal e As EventArgs)
Dim page As Page = TryCast(sender, Page)
If page Is Nothing Then
Return
End If
If Me.description IsNot Nothing Then
page.Header.Controls.Add(Me.description)
End If
If Me.keywords IsNot Nothing Then
page.Header.Controls.Add(Me.keywords)
End If
End Sub
Ja ami még fontos! Importok:
Imports System.Web.UI.WebControls
Imports System.Web.UI.HtmlControls
3) Na. De az egészet azért csináltuk, hogy oldalanként megadható legyen. Szóval a fogjuk a Web Content Form-unkat és adjuk meg a kívánt meta tagek-et a PlaceHolderek-ben.
<asp:Content ID="Content1" ContentPlaceHolderID="MetaDescription" runat="server">Jó kis szöveges leírás jön az oldalról</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MetaKeywords" runat="server">itt a kifejezések, vesszővel elválasztva, felsorolva</asp:Content>
Más dolgunk nincs, mint a megjelenő oldal forrás nézetében ellenőrízni, hogy jól dolgoztunk-e :)
Hát ennyi! Remélem hasznos volt! :)