我想阻止我的一些页面显示在搜索结果中.我的理解是我在页面的部分添加了以下内容:
问题是我的页面使用了一个常见的布局页面.就像是:
@{ Layout = "~/Views/Shared/_VanillaLayout.cshtml"; }
布局页面内部是头部,包含大量链接,脚本和元标记.我不想为可索引和不可索引的页面复制它.
根据我的研究,我发现: -
有多个部分很糟糕.
机器人元标记在头部之外是不好的.
使用robots.txt比我想要的还多,而且很糟糕.
试图通过模型到布局是有点矫枉过正的(需要的所有车型,从一些基本的和多页继承纯属演示,他们甚至没有一个模型),是坏的.
希望我错过了一些东西并且有一种很好的(非坏的)方法可以做到这一点,或者我上面提到的其中一种方法毕竟不是那么糟糕.
您可以使用元标记将以下条件添加到<head>
公共布局中的元素:
<!DOCTYPE html> <html> <head> <title>@ViewBag.Title</title> @if (PageData["DisableIndexing"]) { <meta name="robots" content="noindex,nofollow"/> } ... </head> <body> ... </body>
默认情况下,该标志将在主_ViewStart.cshtml
文件中设置为禁用,即Views文件夹中的标志.这意味着默认情况下,没有页面会添加该元标记.这将是_ViewStart文件:
@{ Layout = "~/Views/Shared/_VanillaLayout.cshtml"; PageData["DisableIndexing"] = false; }
最后,在要禁用索引的页面上,您只需要覆盖该标志.例如,如果Foo视图不允许索引,您可以:
@model MyNamespace.MyFooModel @{ ViewBag.Title = "Foo"; PageData["DisableIndexing"] = true; } ...
如果某个文件夹中的所有视图都应禁用索引,您甚至可以将另一个_ViewStart.cshtml文件添加到您刚设置的文件夹中 PageData["DisableIndexing"] = true;
作为旁注,您还可以使用ViewBag将数据从_ViewStart传递到布局,但代码有点难看,因为您无法直接访问ViewStart中的ViewBag.如果您更喜欢使用ViewBag,请参阅此答案.
在我看来,最简单的方法是在<head>
布局文件的标记中定义一个部分,您可以选择在视图中填充数据
<head> <meta charset="utf-8" /> <title>@ViewBag.Title - My ASP.NET MVC Application</title> <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" /> <meta name="viewport" content=" /> <!-- Adding a RenderSection here, mark it as not required--> @RenderSection("AdditionalMeta", false) @Styles.Render("~/Content/css") </head>
现在,在您需要添加其他元数据的任何视图中,只需在视图文件的结尾/开头(模型声明之后)添加以下代码
@section AdditionalMeta { <meta name="robots" content="noindex,nofollow"/> }
由于所有Razor的东西都是在服务器端进行处理的,因此在a)JS附加项目时会出现问题,因为有些爬虫不能实现JS而b)没有后期附加到<head>
标签/ etc.此外,标记为不需要意味着您只需要更新您不想编入索引的页面,而不必在应用程序的每个页面上设置变量.
如果您没有在布局页面中定义任何元标记,并且只是想从页面添加,那么您可以执行以下操作.
在您的布局页面_VanillaLayout.cshtml的head部分下使用@RenderSection如下
<head> <meta charset="utf-8"> @RenderSection("SeoRender", false) </head>
现在在您的视图页面中执行以下操作
@{ Layout = "~/Views/Shared/_VanillaLayout.cshtml"; } @section SeoRender{ @{ <title>testTitle</title> <meta name="keyword" content="testkeyword"> <meta name="description" content="testdescription"> <meta name="author" content="testauthor"> }
因此,您可以在页面中单独定义特定元标记和其他内容.