代码之家  ›  专栏  ›  技术社区  ›  JP.

net mvc-包含搜索引擎优化信息(如元关键字和描述)的策略

  •  26
  • JP.  · 技术社区  · 14 年前

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

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

    提前谢谢你,

    日元

    5 回复  |  直到 14 年前
        1
  •  24
  •   jgauffin    14 年前

    我将在控制器操作上使用属性并将它们添加到 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
  •  17
  •   Pinte Dani    10 年前

    另一种方法是在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";
    }
    
        3
  •  14
  •   Pavel Chuchuva grapeot    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>
    

    Optional Razor Sections with Default Content 马辛多波兹。

        4
  •  6
  •   Fenton    14 年前

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

    母版页:

    <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
  •  5
  •   Darin Dimitrov    14 年前

    1)你预见到这种方法有什么问题吗?

    不。

    2)还有其他合适的方法吗?

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

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

    这将取决于你的网站正在做什么,它是如何组织的,信息存储在哪里。。。