MVC 3 Razor Meta Описание / Ключевые слова - PullRequest
4 голосов
/ 10 февраля 2011

Какой самый простой способ получить мета-описание / ключевые слова на моей странице _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";
}

Ответы [ 2 ]

4 голосов
/ 18 января 2012

Я написал специальный метатег помощника 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 -> Заголовок главной страницы

md_home -> описание домашней страницы здесь

mk_home -> ключевые слова на главной странице

около страницы mt_home_about -> о названии и т.д.

У вас также есть возможность перезаписывать метаданные из ресурсов в определенных представлениях, например, так Index.cshtml:

@{
    ViewBag.Title = "New TITLE";
    ViewBag.Description = "New Description";    
}
4 голосов
/ 10 февраля 2011

Ваше мнение не должно отвечать за это (не добавляйте логику в представления). Вместо этого метод действия должен указывать метаинформацию.

Проверьте мой ответ здесь: asp.net mvc - стратегия включения SEO-информации, такой как мета-ключевые слова и описания

Ответ по-прежнему применим, хотя вы должны использовать ViewBag вместо ViewData.

...