2010-04-29 92 views
5

我試圖在我們的網站上優化SEO可讀性,我遇到過的一個問題是ASP.NET屠宰了我的母版頁的標題元素。在我的母版進入這樣(手動重新格式化,刪除引起<% %>標籤換行):標題元素中的ASP.NET換行符

<title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /> - <%=WebsiteSettings.WebsiteName %></title> 

這是輸出我收到:

<title> 
    Home 
- Website Name</title> 

正如你可以看到ASP.NET是增加前面和後面的換行符,因爲<asp:ContentPlaceHolder />被替換,所以Visual Studio自動格式<asp:Content />以換行符開頭和結尾。顯然,在Visual Studio格式化選項中可以防止這種情況,但這並不理想,因爲我只想爲TitleContent佔位符刪除該行爲,而不是其他的。

有什麼辦法可以確保我的標題在呈現前被修剪?我正在使用MVC,因此代碼隱藏不是一個可接受的選項。

+3

它真的很重要嗎?空格在HTML中並不重要,我懷疑任何嚴肅的搜索引擎解析器都會發現它是一個問題。 – 2010-04-29 15:50:24

回答

2

下面應該讓你記p從複製和粘貼代碼。

選項1

由於您使用MVC創建HTML輔助就像這樣:

namespace [ProjectName].Web.Views 
{ 
    public static class HtmlHelpers   
    { 
      public static MvcHtmlString GetFullPageTitle(this HtmlHelper helper, string PageTitle) 
      { 
       return MvcHtmlString.Create(PageTitle + " - " + WebsiteSettings.WebsiteName) 
      } 
    } 
} 
在您的母版頁

現在只是把這個

<title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title> 

然後在你的頁面中使用此

<asp:Content ID="PageTitleContent" ContentPlaceHolderID="TitleConent" runat="server"> 
    <%=Html.GetFullPageTitle("Some PageTitle")%> 
</asp:Content> 

選項2

注:如果您在操作中填充數據,那麼你不要有這種加入過的頁面。

像這樣:

public ActionResult myAction() 
{ 
    ViewData["Title"] = "MyActionTitle"; 
    return View() 
} 

然後在你的主網頁,你會簡單地做這個以下

<title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /><%= ViewData["Title"] + "-" + WebsiteSettings.WebsiteName %></asp:ContentPlaceHolder></title> 

的好處是,如果你想,你可以重寫什麼稱號說通過這樣做的每頁

<asp:Content ID="PageTitleContent" ContentPlaceHolderID="TitleConent" runat="server"> 
     My Override Title 
    </asp:Content> 
+0

我喜歡這個解決方案,儘管我不能將它應用於我一直在尋找的自頂向下的方法。實際上,需要對大約10個站點進行這種更改,因此我希望它儘可能少地與內容頁面聯繫。 – 2010-04-29 16:26:50

+0

Nathan看看我的修改,第二種方法可以讓你簡單地運行你的控制器操作,併爲每個返回View的操作添加ViewData [「Title」] =「something」。你可以做一個搜索並替換這個 – 2010-04-29 16:30:07

+0

我喜歡第二種方法。尼斯。今天晚些時候做得更好,我會接受它的。 :) – 2010-04-29 17:21:22

0

你可以嘗試一個文字控件,雖然我懷疑這將不會在asp.net窗體以外的文檔標題中工作。您也可以嘗試通過代碼隱藏設置標題。

1

如果你真的困擾(我不明白爲什麼你會被給予空白是不是在HTML重要的),你可以嘗試在後臺代碼是這樣設置的:

Page.Title = WebsiteSettings.WebsiteName + " " + Page.Title; 
+0

請注意我的問題的最後一句:我使用MVC,因此代碼隱藏不是一個可接受的選項。 – 2010-04-29 16:01:23

+0

對不起,錯過了那部分 - 忽略。 – 2010-04-29 16:14:25

1

使用正則表達式,因爲dagray說,是保險櫃t和最簡單的方法。

該代碼僅替換第一個標題標籤中第一次出現的換行/字符。

void TrimTitleRegex(ref string content) 
{ 
    System.Text.RegularExpressions.Regex rgx = new System.Text.RegularExpressions.Regex(@"\<title\>(.*?)\<\/title\>"); 
    var result = rgx.Replace(content, 
    m => 
    { 
     var codeString = m.Groups[1].Value; 
     // then you have to evaluate this string 
     codeString = System.Text.RegularExpressions.Regex.Replace(codeString, @"\r\n?|\n", ""); 
     codeString = String.Format("<title>{0}</title>", codeString); 
     return codeString.Trim(); 
    }, 1); 

    content = result; 
}