2011-02-10 3 views
4

Quel est le moyen le plus simple d'obtenir méta description/mots-clés sur ma page _Layout? Quelque chose de similaire à comment vous obtenez le titre de la page serait bien. Tels queMVC 3 Razor Meta Description/Mots-clés

<title>@ViewBag.Title</title> 
<meta name="keywords" content='@ViewBag.Keywords'/> 
<meta name="description" content='@ViewBag.Description'/> 

Mon opinion ressemblerait à quelque chose comme:

@{ 
    ViewBag.Title = "Contact Me"; 
    ViewBag.Keywords = "My, keyword, list, etc"; 
} 
+1

double possible de [asp.net mvc - stratégie inc luding des informations de SEO telles que les mots-clés de méta et les descriptions] (http://stackoverflow.com/questions/4263568/asp-net-mvc-strategy-for-including-seo-information-such-as-meta-keywords-and-de – jgauffin

Répondre

4

Votre vue ne devrait pas être responsable de ce (ne pas ajouter à la logique des vues). Au lieu de cela, c'est la méthode d'action qui doit spécifier les méta-informations.

Vérifiez ma réponse ici: asp.net mvc - strategy for including SEO information such as meta keywords and descriptions

La réponse sont toujours valables même si vous devez utiliser ViewBag au lieu de ViewData.

+0

Acclamations, mais ont été les propriétés MetaKeywords/MetaDescription définies; ould Je crée un ViewModel pour les contenir, puis crée une vue fortement typée avec le nouveau ViewModel? Merci – user547043

+0

Si vous voulez dire les attributs: Vous devez les créer vous-même. Si vous voulez dire dans le ViewBag/ViewData: Dans votre basecontroller (méthode OnActionExecuting) – jgauffin

+0

Comment avez-vous obtenu les mots-clés d'une base de données en utilisant des attributs? –

4

J'ai écrit un helper métatag personnalisé mvc3 qui ferait exactement cela. Il fonctionne avec des ressources lors de l'utilisation de plusieurs langues (le cas échéant):

public enum MetatagType 
{ 
    /// <summary> 
    /// Used for Title meta tag. 
    /// </summary> 
    Title, 

    /// <summary> 
    /// Used for Description and keyword meta tag. 
    /// </summary> 
    MetaData, 

    /// <summary> 
    /// Used for noindex, nofollow meta tag. 
    /// </summary> 
    Robots 
} 

public static class MetatagExtensions 
    { 
     #region Public Methods 

     public static MvcMetaTag MetaTag(this HtmlHelper helper, MetatagType metaType) 
     { 
      return new MvcMetaTag(helper, metaType); 
     } 

     #endregion 

     public sealed class MvcMetaTag 
     { 
      #region Constructors and Destructors 

      public MvcMetaTag(HtmlHelper helper, MetatagType metaType) 
      { 
       this.Helper = helper; 
       this.MetaType = metaType; 
      } 

      #endregion 

      #region Properties 

      /// <summary> 
      /// Gets or sets Helper. 
      /// </summary> 
      private HtmlHelper Helper { get; set; } 

      /// <summary> 
      /// Gets or sets MetaType. 
      /// </summary> 
      private MetatagType MetaType { get; set; } 

      #endregion 

      #region Public Methods 

      public MvcHtmlString Render() 
      { 
       var sb = new StringBuilder(); 
       if (this.Helper.ViewContext.RouteData.DataTokens.ContainsKey("area")) 
       { 
        sb.Append(this.Helper.ViewContext.RequestContext.RouteData.DataTokens["area"].ToString().ToLower()); 
        sb.Append('_'); 
       } 
       sb.Append(this.Helper.ViewContext.RequestContext.RouteData.Values["controller"].ToString().ToLower()); 
       if (this.Helper.ViewContext.RequestContext.RouteData.Values["action"].ToString().ToLower() != "index") 
       { 
        sb.Append('_'); 
        sb.Append(this.Helper.ViewContext.RequestContext.RouteData.Values["action"].ToString().ToLower()); 
       } 

       var resourcemng = SharedResources.ResourceManager; 
       var meta = new StringBuilder(); 
       switch (this.MetaType) 
       { 
        case MetatagType.MetaData: 
         meta.AppendLine(
          String.Format(
           "<meta name=\"description\" content=\"{0}\" />", 
           this.Helper.ViewData["Description"] 
           ?? resourcemng.GetString(string.Format("md_{0}", sb)) ?? string.Empty)); 
         meta.AppendLine(
          String.Format(
           "<meta name=\"keywords\" content=\"{0}\" />", 
           this.Helper.ViewData["Keywords"] 
           ?? resourcemng.GetString(string.Format("mk_{0}", sb)) ?? string.Empty)); 
         break; 
        case MetatagType.Robots: 
         meta.AppendLine(
          String.Format(
           "<meta name=\"robots\" content=\"{0}\" />", 
           this.Helper.ViewData["Robots"] 
           ?? resourcemng.GetString(string.Format("mr_{0}", sb)) ?? string.Empty)); 
         break; 
        case MetatagType.Title: 
         meta.AppendLine(
          (string)(this.Helper.ViewData["Title"] 
            ?? resourcemng.GetString(string.Format("mt_{0}", sb)) ?? string.Empty)); 
         break; 
       } 

       return new MvcHtmlString(meta.ToString()); 
      } 

      #endregion 
     } 
    } 

Ensuite, dans votre _Layout.cshtml fichier que vous l'utilisez comme ceci: ...

<head runat="server"> 
     <title>@Html.MetaTag(MetatagType.Title).Render()</title> 

@Html.MetaTag(MetatagType.MetaData).Render() 

...

Dans votre fichier de ressources, vous devez ajouter les éléments suivants (Controller-> Accueil, action-> Index):

mt_home -> Page d'accueil Titre

md_home -> Description de la page d'accueil ici

mk_home -> mots-clés page d'accueil

pour page à propos mt_home_about -> sur le titre etc.

Vous avez également une option pour remplacer les métadonnées des ressources spécifiques vues comme si Index.cshtml:

@{ 
    ViewBag.Title = "New TITLE"; 
    ViewBag.Description = "New Description";  
}