asp.net-mvc-3
  • razor
  • meta
  • 2011-02-10 14 views 4 likes 
    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

    [asp.net mvc - strategy for incメタキーワードや説明などのSEO情報を提供する](http://stackoverflow.com/questions/4263568/asp-net-mvc-strategy-for-including-seo-information-such-as-meta-keywords-andde ) – jgauffin

    答えて

    4

    あなたのビューがその責任を負うべきではない(ビューにロジックを追加しないでください)。代わりに、メタ情報を指定するアクションメソッドです。

    は、ここに私の答えをチェックしてください:asp.net mvc - strategy for including SEO information such as meta keywords and descriptions

    答えはまだ適用され、あなたがViewBag代わりのViewDataを使用する必要がありますが。

    +0

    メジャーキーワード/ MetaDescriptionのプロパティがうまくいきました。私はそれらを含むViewModelを作成し、新しいViewModelで強く型付けされたビューを作成しますか?ありがとう – user547043

    +0

    あなたが属性を意味する場合:あなたはそれを自分で作成する必要があります。 ViewBag/ViewDataの場合:basecontroller(メソッドOnActionExecuting) – jgauffin

    +0

    属性を使用してデータベースからどのようにキーワードを取得しましたか? –

    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 - >ホームページタイトル

    md_home - >ホームページの説明ここ

    mk_home - >ホームページのキーワード

    約ページ mt_home_about用 - >など

    タイトル についてまた、特定のリソースからメタデータを上書きするオプションを持っていますこのようなビュー Index.cshtml:

    @{ 
        ViewBag.Title = "New TITLE"; 
        ViewBag.Description = "New Description";  
    } 
    
    関連する問題