Подтвердить что ты не робот

Asp.net mvc - стратегия включения информации SEO, такой как мета-ключевые слова и описания

Мне было интересно, что, если таковой существует, это лучшая практика для включения SEO-контента, такого как метаописания и ключевые слова в ASP.NET MVC (я использую v3 RC). Мой первоначальный план - создать actionfilter, применяемый глобально к действиям, вытащить соответствующие данные из хранилища данных и передать его как viewdata в представление.

Мои вопросы: 1) Предвидите ли вы какие-либо проблемы с этим подходом? 2) Есть ли более подходящие подходы? 3) что такое подходящее хранилище данных для использования здесь - должен ли я извлечь из БД (или кеш, если данные доступны), использовать файлы ресурсов, файлы конфигурации и т.д.?

Спасибо заранее,

В JP

4b9b3361

Ответ 1

Я бы использовал атрибуты для своих действий с контроллером и добавил их в ViewData в моем базовом контроллере в методе OnExecutingAction.

Мотивация помещать его в контроллер, а не мнение, состоит в том, что он действительно больше информации о действительном действии, чем о представлении. И вы можете использовать его при возврате различных форматов, таких как json или xml.

контроллер

class MyController
{

  [MetaKeywords("hello,world,something,else")]
  [MetaDescription("Tells you how to greet the world")]
  ActionResult Hello()
  {
      return View();
  }
}

Вы всегда можете использовать файл ресурсов вместо простых строк.

в базовом контроллере:

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var keywords = filterContext.ActionDescriptor.GetCustomAttributes(typeof(MetaKeywordsAttribute), false);
        if (keywords.Length == 1)
            ViewData["MetaKeywords"] = keywords.Value;

        var description = filterContext.ActionDescriptor.GetCustomAttributes(typeof(MetaDescriptionAttribute), false);
        if (description.Length == 1)
            ViewData["MetaDescription"] = description.Value;

        base.OnActionExecuting(filterContext);
    }

В вашем макете

<meta name="keywords" value="@View.MetaKeywords" />

И вот ответы на ваши вопросы: =)

1) Предвидите ли вы какие-либо проблемы с этим подходом?

Неа. Это прекрасный подход.

2) Есть ли еще подходящие подходы?

Просто дал вам альтернативу.

3) что такое подходящее хранилище данных для использования здесь - должен ли я извлечь из БД (или кеш, если данные доступны), использовать файлы ресурсов, файлы конфигурации и т.д.?

Я бы разместил его в текстовом виде (если вам не нужно поддерживать несколько языков), иначе в файле ресурсов. Эта информация обычно не изменяется, если не изменен вид или контроллер (где в любом случае требуется перекомпиляция). Следовательно, нет необходимости в более динамическом источнике.

Ответ 2

Добавьте необязательный раздел на страницу макета:

<!DOCTYPE html>
<html>
<head>
  @RenderSection("ExtraHeadContent", required: false)
</head>
<body>

Теперь вы можете определить метатеги на любой странице контента с помощью @section:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@section ExtraHeadContent {
    <meta name="description" content="My super page">
}

<div>The main content</div>

См. Дополнительные разделы Razor с содержимым по умолчанию от Marcin Doboz.

Ответ 3

Другим подходом было бы просто использовать в _Layout.cshtml:

    <html>
    <head>
         <title>@ViewBag.Title</title>
         <meta name="description" content="@ViewBag.MetaDescription" />
         <meta name="keywords" content="@ViewBag.MetaKeywords" />
    </head>
    <body>

И в ваших представлениях вы определяете отдельно для каждого представления соответствующие заголовок/описание/ключевые слова:

Например, в Home/Index.cshtml используйте:

@{
    ViewBag.Title = "Home page title | samplePage.com";
    ViewBag.MetaDescription = "Home page meta description";
    ViewBag.MetaKeywords = "meta keywords keyword home page";
}

Ответ 4

Если вы используете основную страницу, вы можете создавать контент-заполнители для размещения ключевых слов и описания, которые вы визуализируете в представлении из данных в Модели. Данные в модели могут либо поступать непосредственно из поля базы данных, либо из помощника, который генерирует его на основе других материалов!

Мастер-страница:

<asp:contentplaceholder id="MetaTags" runat="server" />

Вид:

<asp:Content ID="Content1" ContentPlaceHolderID="MetaTags" runat="server">
    <meta name="keywords" content="<%= Model.Keywords %>">
    <meta name="description" content="<%= Model.Description %>">
</asp:Content>

Ответ 5

1) Предвидите ли вы какие-либо проблемы с этим подходом?

Нет.

2) Есть ли еще более подходящие подходы?

Я хотел бы написать вспомогательный метод для этого или использовать дочернее действие вместе с Html.Action помощником, потому что вы будете извлекать данные из базы данных.

3) что такое подходящее хранилище данных для использования здесь - должен ли я извлечь из БД (или кеш, если данные доступны), использовать файлы ресурсов, файлы конфигурации и т.д.?

Это будет зависеть от того, что делает ваш сайт, как он организован, где хранится информация,...