2010-04-29 2 views
5

Я пытаюсь оптимизировать читаемость SEO на наших веб-сайтах, и одна проблема, с которой я столкнулся, - это ASP.NET, разбивающий элемент заголовка моего MasterPage. Поступил как таковой в моем MasterPage (вручную переформатировать, чтобы удалить разрывы строк, вызванные <% %> теги):Разбиение строк в ASP.NET в элементе Title

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

Это выход я получаю:

<title> 
    Home 
- Website Name</title> 

Как вы можете видеть ASP.NET является добавление предшествующие и завершающие разрывы строк, где <asp:ContentPlaceHolder /> заменяет becaused автоформаты Visual Studio <asp:Content /> для начала и окончания разрыва строки. Очевидно, что это может быть предотвращено в параметрах форматирования Visual Studio, но это не идеально, потому что я только хотел бы удалить это поведение для заполнитель TitleContent, а не для остальных.

Можно ли каким-либо образом обеспечить, чтобы мой заголовок был обрезан до его визуализации? Я использую MVC, поэтому код не является приемлемым вариантом.

+3

Действительно ли это имеет значение? Пробелы не важны в HTML, и я сомневаюсь, что любой серьезный синтаксический анализатор поисковой системы обнаружит, что это проблема. –

ответ

2

следующая позволит вам Kee p от копирования и вставки кода.

Вариант 1

С вашей помощью MVC создать HTML Helper Как это:

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() 
} 

Тогда в вашем Master странице вы бы просто сделать следующее

<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 сайтах, поэтому я бы хотел, чтобы он требовал как можно меньше контактов с страницами контента. –

+0

Натан посмотрел на мои модификации. Второй способ позволит вам просто выполнить действия с вашим контроллером и добавить ViewData ["Title"] = "something" для каждого действия, которое возвращает вид. Вы можете выполнить поиск и заменить для этого –

+0

Мне нравится второй подход. Ницца. Если сегодня что-то не получается, я приму это. :) –

0

Вы можете попробовать литеральный контроль, хотя я подозреваю, что это не будет работать в заголовке документа вне формы asp.net. Вы также можете попробовать установить заголовок с помощью кода.

1

Если вы действительно беспокоили (и я не понимаю, почему вы дали бы пробелы не важно в HTML), вы можете попробовать установить его в коде, за что-то вроде этого:

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

Обратите внимание на последнее предложение моего вопроса: я использую MVC, поэтому код-код не является приемлемым. –

+0

Прости, пропустил эту часть - Игнорировать. –

1

Использование регулярных выражений, как сказал Дагрей, является сейфом 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; 
}