2010-04-29 13 views
5

Sto cercando di ottimizzare la leggibilità SEO sui nostri siti Web e un problema che ho riscontrato è che ASP.NET ha macellato l'elemento titolo della mia MasterPage. Indicato come tale nella mia MasterPage (riformattato manualmente per rimuovere le interruzioni di riga causate dai <% %> tag):Interruzioni di riga in ASP.NET nell'elemento titolo

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

Questa è l'uscita ricevo:

<title> 
    Home 
- Website Name</title> 

Come si può vedere è l'aggiunta di ASP.NET interruzioni di riga precedenti e finali in cui lo <asp:ContentPlaceHolder /> è sostitutivo in base ai formati automatici di Visual Studio <asp:Content /> per iniziare e terminare con un'interruzione di riga. Ovviamente, questo può essere impedito nelle opzioni di formattazione di Visual Studio, ma questo non è l'ideale perché vorrei solo rimuovere quel comportamento per il segnaposto TitleContent e non il resto.

C'è un modo per garantire che il mio titolo venga ritagliato prima del rendering? Sto usando MVC quindi il code-behind non è un'opzione accettabile.

+3

Ha davvero importanza? Gli spazi bianchi non sono importanti in HTML e dubito che qualsiasi parser di motori di ricerca serio possa trovarlo un problema. –

risposta

2

il seguente dovrebbe consentire di Kee p dal codice di copia e incolla.

Opzione 1

Dal momento che la vostra utilizzando MVC creare un HTML Helper Ti piace questa:

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

Ora nel tuo pagina master appena messo questo

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

Poi nelle vostre pagine utilizzano questo

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

Opzione 2

Nota: se si popolano di dati nella vostra azione, allora non dovete aggiungere questo alla pagina mai.

Come così:

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

Poi nella tua pagina master si dovrebbe semplicemente effettuare le seguenti operazioni

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

La cosa bella di questo è che se si voleva si poteva ignorare quello che dice il titolo in facendo ogni cosa

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

Mi piace questa soluzione, anche se non posso applicarla nell'approccio dall'alto verso il basso che stavo cercando. Realisticamente questo cambiamento deve essere fatto per circa 10 siti, quindi mi piacerebbe che richiedesse il minor contatto possibile con le pagine di contenuto. –

+0

Nathan guarda le mie modifiche, Il secondo metodo consente di eseguire semplicemente le azioni del controller e aggiungere ViewData ["Titolo"] = "qualcosa" a ciascuna azione che restituisce una vista. Potresti fare una ricerca e sostituirla per questo –

+0

Mi piace il secondo approccio. Bello. Non riuscendo a qualcosa di meglio oggi, lo accetterò. :) –

0

Si potrebbe provare un controllo letterale, anche se ho il sospetto che non funzionerà nell'intestazione del documento al di fuori del modulo asp.net. Potresti anche provare a impostare il titolo tramite code-behind.

1

Se siete veramente disturbato (e non vedo il motivo per cui si sarebbe dato spazio bianco non è importante in HTML) si potrebbe provare a impostare nel code-behind qualcosa di simile:

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

Si prega di notare l'ultima frase della mia domanda: sto usando MVC quindi il code-behind non è un'opzione accettabile. –

+0

Mi dispiace, ho perso quella parte - Ignora. –

1

Uso di espressioni regolari, come dice Dagray, sono le casseforti t e l'approccio più semplice.

Questo codice sostituisce solo la prima occorrenza di nuova riga/caratteri nel tag del primo titolo.

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; 
} 
Problemi correlati