2011-02-10 94 views
4

将元描述/关键字放到我的_Layout页面上的最简单方法是什么? 类似于你如何获得页面标题会很好。如MVC 3 Razor Meta描述/关键字

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

我的观点看起来是这样的:

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

可能重复 - 战略INC鲁丁搜索引擎优化信息,如元关键字和描述](http://stackoverflow.com/questions/4263568/asp-net-mvc-strategy-for-including-seo-information-such-as-meta-keywords-and-de ) – jgauffin 2011-02-10 09:51:17

回答

4

你的观点不应该负责的是(不添加逻辑视图)。相反,它是应该指定元信息的操作方法。

检查我的答案在这里:asp.net mvc - strategy for including SEO information such as meta keywords and descriptions

答案仍然适用,但你应该使用ViewBag而不是ViewData

+0

干杯,但都是定义的MetaKeywords/MetaDescription属性;我应该创建一个ViewModel来包含它们,然后用新的ViewModel创建一个强类型的视图?谢谢 – user547043 2011-02-10 10:31:11

4

我写了一个自定义的mvc3元标签助手,可以做到这一点。它使用多种语言时(如果需要)可与资源:

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

然后在你的_Layout.cshtml文件,你使用它,像这样: ...

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

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

...

在您的资源文件中,您应该添加以下内容(控制器 - >主页,操作 - >索引):

mt_home - > homepage标题

md_home - >主页的描述在这里

mk_home - >网页关键字

约页 mt_home_about - >关于标题 等

您也有一个选项,在特定的资源元数据覆盖景色像这样 Index.cshtml:

@{ 
    ViewBag.Title = "New TITLE"; 
    ViewBag.Description = "New Description";  
} 
[asp.net的MVC的