asp.net mvc - стратегия включения SEO-информации, такой как мета-ключевые слова и описания - PullRequest
26 голосов
/ 24 ноября 2010

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

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

Заранее спасибо,

JP

Ответы [ 5 ]

21 голосов
/ 26 ноября 2010

Я бы использовал атрибуты в действиях моего контроллера и добавил их к 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) Какое хранилище данных использовать здесь - следует ли мне извлекать данные из БД (или кэшировать, если данные доступны)), использовать файлы ресурсов, файлы конфигурации и т. д.?

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

15 голосов
/ 06 февраля 2015

Другим подходом было бы просто использовать в _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";
}
13 голосов
/ 02 декабря 2011

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

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

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

6 голосов
/ 02 декабря 2010

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

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

<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 голосов
/ 24 ноября 2010

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

номер

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...