我想知道在ASP.NET MVC(我正在使用v3 RC)视图中包含SEO内容(如元描述和关键字)的最佳实践,如果有的话。我最初的计划是创建一个动作过滤器,全局应用于动作,从数据存储中提取相关数据并将其作为viewdata传递给视图。
我的问题是: 1)您是否预见到这种方法有任何问题? 2)还有更合适的方法吗? 3)在这里使用什么是合适的数据存储 - 我应该从数据库中提取(如果数据可用,则缓存),使用资源文件,配置文件等?
提前致谢,
JP
答案 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)在这里使用什么是合适的数据存储 - 我应该从数据库中提取(如果数据可用,还是缓存),使用资源文件,配置文件等?
这取决于您的网站正在做什么,如何组织,存储信息的位置,......