2010-04-29 21 views
5

Estoy tratando de optimizar la legibilidad de SEO en nuestros sitios web y un problema que he encontrado es que ASP.NET elimina el elemento de título de mi página maestra. Mencionado como tal en mi MasterPage (reordenada en forma manual para eliminar los saltos de línea causados ​​por los <% %> etiquetas):Saltos de línea ASP.NET en el elemento de título

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

Ésta es la salida recibo:

<title> 
    Home 
- Website Name</title> 

Como se puede ver es la adición de ASP.NET Saltos de línea anteriores y posteriores en los que el <asp:ContentPlaceHolder /> se sustituye por los formatos automáticos de Visual Studio <asp:Content /> para iniciar y finalizar con un salto de línea. Obviamente, esto se puede evitar en las opciones de formato de Visual Studio, pero esto no es ideal porque solo quisiera eliminar ese comportamiento para el marcador de posición TitleContent y no el resto.

¿Hay alguna manera de asegurarme de que mi título esté recortado antes de que se procese? Estoy usando MVC, por lo que el código subyacente no es una opción aceptable.

+3

¿Realmente importa? El espacio en blanco no es importante en HTML y dudo que cualquier analizador serio del motor de búsqueda lo encuentre un problema. –

Respuesta

2

la siguiente le debería permitir a Kee p de copiar y pegar el código.

Opción 1

Debido a que su uso de MVC crear un HTML Ayudante De esta manera:

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

En su página maestra a ponerlo de esta

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

Luego, en sus páginas utilizan

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

Opción 2

Nota: Si rellena los datos de su acción, entonces usted no tiene que Añadir esta página a nunca.

así:

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

Luego, en la página principal sólo tendría que hacer lo siguiente

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

Lo bueno de esto es que si usted quiere que podrían anular lo que dice el título de cada página haciendo esto

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

Me gusta esta solución, aunque no puedo aplicarla en el enfoque de arriba hacia abajo que estaba buscando. De manera realista, este cambio debe realizarse en aproximadamente 10 sitios, por lo que me gustaría que requiera el menor contacto posible con las páginas de contenido. –

+0

Nathan mira mis modificaciones, El segundo método te permite simplemente ejecutar las acciones de tu controlador y agregar ViewData ["Título"] = "algo" a cada acción que devuelve una Vista. Podría hacer una búsqueda y reemplazar por este –

+0

Me gusta el segundo enfoque. Bonito. Si falla algo mejor el día de hoy, lo aceptaré. :) –

0

Podría intentar un control literal, aunque sospecho que no funcionará en el encabezado del documento fuera del formulario asp.net. También puede intentar configurar el título por código subyacente.

1

Si está realmente molesta (y no veo por qué los espacios en blanco se le daría no es importante en HTML) se podría tratar de colocarlo en código subyacente algo como esto:

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

Tenga en cuenta la última frase de mi pregunta: Estoy utilizando MVC, por lo que el código subyacente no es una opción aceptable. –

+0

Lo siento, me perdí esa parte - Ignorar. –

1

El uso de expresiones regulares, como dijo dagray, es la caja fuerte t y el enfoque más fácil.

Este código reemplaza solo la primera aparición de nueva línea/caracteres en la primera etiqueta del título.

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; 
} 
Cuestiones relacionadas