asp.net mvc - 包含元关键字和描述等SEO信息的策略

JP.*_*JP. 28 c# asp.net-mvc razor

我想知道在ASP.NET MVC(我正在使用v3 RC)视图中包含SEO内容(如元描述和关键字)的最佳实践,如果有的话.我最初的计划是创建一个动作过滤器,全局应用于动作,从数据存储中提取相关数据并将其作为viewdata传递给视图.

我的问题是:1)您是否预见到这种方法有任何问题?2)还有更合适的方法吗?3)在这里使用什么是合适的数据存储 - 我应该从数据库中提取(或者如果数据可用则缓存),使用资源文件,配置文件等?

提前致谢,

J.P

jga*_*fin 24

我会在控制器操作上使用属性,并将它们添加到ViewData方法中的基本控制器中OnExecutingAction.

把它放在控制器而不是视图中的动机是,它实际上是关于实际操作的信息而不是关于视图的信息.并且在返回不同类型的格式(如json或xml)时可以使用它.

调节器

class MyController
{

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

您始终可以使用资源文件而不是纯字符串.

在基本控制器中:

    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);
    }
Run Code Online (Sandbox Code Playgroud)

在你的布局中

<meta name="keywords" value="@View.MetaKeywords" />
Run Code Online (Sandbox Code Playgroud)

以下是您的问题的答案:=)

1)您是否预见到这种方法有任何问题?

不.这是一个很好的方法.

2)还有更合适的方法吗?

刚给你一个替代品.

3)在这里使用什么是合适的数据存储 - 我应该从数据库中提取(或者如果数据可用则缓存),使用资源文件,配置文件等?

我会用纯文本(如果你不需要支持多种语言),或者在资源文件中.除非更改视图或控制器(无论如何都需要重新编译),否则通常不会更改此信息.因此,不需要更动态的来源.


Pin*_*ani 17

另一种方法是在_Layout.cshtml中使用:

    <html>
    <head>
         <title>@ViewBag.Title</title>
         <meta name="description" content="@ViewBag.MetaDescription" />
         <meta name="keywords" content="@ViewBag.MetaKeywords" />
    </head>
    <body>
Run Code Online (Sandbox Code Playgroud)

在您的视图中,您可以为每个视图单独定义相应的标题/描述/关键字:

例如在Home/Index.cshtml中使用:

@{
    ViewBag.Title = "Home page title | samplePage.com";
    ViewBag.MetaDescription = "Home page meta description";
    ViewBag.MetaKeywords = "meta keywords keyword home page";
}
Run Code Online (Sandbox Code Playgroud)

  • 很简单.这确实是最好的解决方案.我不同意所有人说你应该把这些东西放在控制器中.作为SEO和程序员,我可以说这是最易于管理的方式.谁想在每次调整元描述时重新调整.这样可以更轻松地进行测试和更新.荣誉. (6认同)
  • 我添加了`@if (!String.IsNullOrWhiteSpace(ViewBag.MetaDescription)) { &lt;meta name="description" content="@ViewBag.MetaDescription" /&gt; } @if (!String.IsNullOrWhiteSpace(ViewBag.MetaKeywords)) { &lt; meta name="keywords" content="@ViewBag.MetaKeywords" /&gt; }` 这样我就不必在每个页面上都放置元数据。 (2认同)

Pav*_*uva 14

将可选部分添加到布局页面:

<!DOCTYPE html>
<html>
<head>
  @RenderSection("ExtraHeadContent", required: false)
</head>
<body>
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用@section在任何内容页面上定义元标记:

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

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

<div>The main content</div>
Run Code Online (Sandbox Code Playgroud)

请参阅Marcin Doboz的带有默认内容可选剃刀部分.


Fen*_*ton 6

如果您使用母版页,则可以创建内容占位符以容纳关键字和描述,您可以在模型中的数据上在视图上呈现这些关键字和描述.模型中的数据可以直接来自数据库字段,也可以来自基于其他东西生成它的帮助程序!

母版页:

<asp:contentplaceholder id="MetaTags" runat="server" />
Run Code Online (Sandbox Code Playgroud)

视图:

<asp:Content ID="Content1" ContentPlaceHolderID="MetaTags" runat="server">
    <meta name="keywords" content="<%= Model.Keywords %>">
    <meta name="description" content="<%= Model.Description %>">
</asp:Content>
Run Code Online (Sandbox Code Playgroud)


Dar*_*rov 5

1)您是否预见到这种方法有任何问题?

没有.

2)还有更合适的方法吗?

我会为此编写一个辅助方法,或者使用子操作以及Html.Action帮助程序,因为您将从数据库中提取数据.

3)在这里使用什么是合适的数据存储 - 我应该从数据库中提取(或者如果数据可用则缓存),使用资源文件,配置文件等?

这取决于您的网站正在做什么,如何组织,存储的信息在哪里,......