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)
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的带有默认内容的可选剃刀部分.
如果您使用母版页,则可以创建内容占位符以容纳关键字和描述,您可以在模型中的数据上在视图上呈现这些关键字和描述.模型中的数据可以直接来自数据库字段,也可以来自基于其他东西生成它的帮助程序!
母版页:
<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)
1)您是否预见到这种方法有任何问题?
没有.
2)还有更合适的方法吗?
我会为此编写一个辅助方法,或者使用子操作以及Html.Action帮助程序,因为您将从数据库中提取数据.
3)在这里使用什么是合适的数据存储 - 我应该从数据库中提取(或者如果数据可用则缓存),使用资源文件,配置文件等?
这取决于您的网站正在做什么,如何组织,存储的信息在哪里,......