2010-04-29 4 views
5

J'essaie d'optimiser la lisibilité du référencement sur nos sites Web et un problème que j'ai rencontré est ASP.NET qui massacre l'élément titre de mon MasterPage. Entré en tant que tel dans ma MasterPage (manuellement reformaté pour supprimer les sauts de ligne causés par les <% %> tags):Les sauts de ligne ASP.NET dans l'élément de titre

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

Ceci est la sortie que je reçois:

<title> 
    Home 
- Website Name</title> 

Comme vous pouvez le voir ASP.NET ajoute les sauts de ligne précédant et suivant où le <asp:ContentPlaceHolder /> est substitué car Visual Studio formate automatiquement <asp:Content /> pour commencer et se terminer par un saut de ligne. Évidemment, cela peut être évité dans les options de mise en forme de Visual Studio, mais ce n'est pas idéal car je voudrais seulement supprimer ce comportement pour l'espace réservé TitleContent et pas le reste.

Y a-t-il un moyen de m'assurer que mon titre est rogné avant d'être rendu? J'utilise MVC donc le code-behind n'est pas une option acceptable.

+3

Est-ce vraiment? Whitespace n'est pas important en HTML et je doute que tout analyseur de moteur de recherche sérieux trouverait un problème. –

Répondre

2

ce qui suit devrait vous permettre de Kee p de copier et coller du code.

Option 1

Depuis votre utilisation de MVC créer une aide HTML comme ceci:

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

maintenant dans votre page maître vient de mettre cette

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

ensuite dans vos pages utilisent cette

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

Option 2

Remarque: si vous remplissez les données dans votre action, vous n'avez pas à Ajouter cette page jamais.

Comme si:

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

Ensuite, dans la page principale vous simplement effectuer les opérations suivantes

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

La bonne chose à ce sujet est si vous vouliez vous pourriez passer outre ce que dit le titre en chaque page en faisant cela

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

J'aime cette solution, même si je ne peux pas l'appliquer dans l'approche descendante que je cherchais. D'un point de vue réaliste, ce changement doit être effectué sur une dizaine de sites. Je souhaiterais donc que le contact avec les pages de contenu soit aussi limité que possible. –

+0

Nathan regarde mes modifications, La deuxième méthode vous permettrait de simplement exécuter vos actions de contrôleur et ajouter ViewData ["Title"] = "quelque chose" à chaque action qui renvoie une vue. Vous pouvez faire une recherche et remplacer pour cela –

+0

J'aime la deuxième approche. Agréable. A défaut de quelque chose de mieux aujourd'hui, je l'accepterai. :) –

0

Vous pouvez essayer un contrôle littéral, bien que je soupçonne que cela ne fonctionnera pas dans l'en-tête du document en dehors du formulaire asp.net. Vous pouvez également essayer de définir le titre via code-behind.

1

Si vous êtes vraiment pris la peine (et je ne vois pas pourquoi vous serait donné des espaces n'est pas important en HTML), vous pouvez essayer le mettre en quelque chose comme code-behind ceci:

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

Veuillez noter la dernière phrase de ma question: J'utilise MVC, donc le code-behind n'est pas une option acceptable. –

+0

Désolé, raté cette partie - Ignorer. –

1

En utilisant les expressions régulières, comme dagray dit, sont les coffres-forts t et l'approche la plus facile.

Ce code ne remplace que la première occurrence Newline/caractères dans la première balise de titre.

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; 
} 
Questions connexes