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

时间:2010-11-24 04:51:31

标签: c# asp.net-mvc razor

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

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

提前致谢,

JP

5 个答案:

答案 0 :(得分:21)

我会在控制器操作上使用属性,并在方法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)在这里使用什么是合适的数据存储 - 我应该从数据库中提取(如果数据可用,还是缓存),使用资源文件,配置文件等?

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

答案 1 :(得分:15)

另一种方法是在_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";
}

答案 2 :(得分:13)

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

<!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的Optional Razor Sections with Default Content

答案 3 :(得分:6)

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

母版页:

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

答案 4 :(得分:5)

  

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

没有

  

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

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

  

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

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

相关问题