MVC 3 Razor 元描述/关键字

发布于 2024-10-16 12:19:39 字数 385 浏览 9 评论 0原文

将元描述/关键字添加到我的 _Layout 页面上的最简单方法是什么? 类似于获取页面标题的方式会很好。比如

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

What is the simplest way of getting meta description / keywords onto my _Layout page?
Something similar to how you get the page Title would be nice. Such as

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

My view would look something like:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

独木成林 2024-10-23 12:19:39

您的视图不应该对此负责(不要向视图添加逻辑)。相反,应该指定元信息的是操作方法。

在这里检查我的答案:asp.net mvc - 包含 SEO 信息(例如元关键字和描述)的策略

答案仍然适用,尽管您应该使用 ViewBag 而不是 ViewData

Your view should not be responsible of that (do not add logic to views). Instead, it's the action method that should specify meta information.

Check my answer here: asp.net mvc - strategy for including SEO information such as meta keywords and descriptions

The answer still apply, although you should use ViewBag instead of ViewData.

回忆凄美了谁 2024-10-23 12:19:39

我编写了一个自定义的 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()

...

在您的资源文件中,您应该添加以下内容(Controller-> Home,Action-> Index):

mt_home -> Index主页标题

md_home ->主页描述在这里

mk_home -> 首页关键字

关于页面的
mt_home_about->关于标题
等等。

您还可以选择覆盖特定视图中资源的元数据,如下所示
索引.cshtml:

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

I wrote a custom mvc3 metatag helper that would do just that. It works with resources when using multiple languages (if required):

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

Then in your _Layout.cshtml file you use it like so:
...

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

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

...

In your resources file you should add the following (Controller-> Home, Action->Index):

mt_home -> homepage Title

md_home -> homepage description here

mk_home -> homepage keywords

for about page
mt_home_about -> about title
etc.

You also have an option to overwrite metadata from resources in specific views like so
Index.cshtml:

@{
    ViewBag.Title = "New TITLE";
    ViewBag.Description = "New Description";    
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文