Asp.net mvc - стратегия включения информации SEO, такой как мета-ключевые слова и описания
Мне было интересно, что, если таковой существует, это лучшая практика для включения SEO-контента, такого как метаописания и ключевые слова в ASP.NET MVC (я использую v3 RC). Мой первоначальный план - создать actionfilter, применяемый глобально к действиям, вытащить соответствующие данные из хранилища данных и передать его как viewdata в представление.
Мои вопросы:
1) Предвидите ли вы какие-либо проблемы с этим подходом?
2) Есть ли более подходящие подходы?
3) что такое подходящее хранилище данных для использования здесь - должен ли я извлечь из БД (или кеш, если данные доступны), использовать файлы ресурсов, файлы конфигурации и т.д.?
Спасибо заранее,
В JP
Ответы
Ответ 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) что такое подходящее хранилище данных для использования здесь - должен ли я извлечь из БД (или кеш, если данные доступны), использовать файлы ресурсов, файлы конфигурации и т.д.?
Это будет зависеть от того, что делает ваш сайт, как он организован, где хранится информация,...