asp.net mvc - 不同的视图需要在<head>内部布局页面中使用不同的元标记

aca*_*lon 33 html asp.net-mvc razor

我想阻止我的一些页面显示在搜索结果中.我的理解是我<head>在页面的部分添加了以下内容:

<meta name="robots" content="noindex,nofollow"/>
Run Code Online (Sandbox Code Playgroud)

问题是我的页面使用了一个常见的布局页面.就像是:

@{
    Layout = "~/Views/Shared/_VanillaLayout.cshtml";
}
Run Code Online (Sandbox Code Playgroud)

布局页面内部是头部,包含大量链接,脚本和元标记.我不想为可索引和不可索引的页面复制它.

根据我的研究,我发现: -

  • 有多个<head>部分很糟糕.
  • 机器人元标记在头部之外是不好的.
  • 使用robots.txt比我想要的还多,而且很糟糕.
  • 试图通过模型到布局是有点矫枉过正的(需要的所有车型,从一些基本的和多页继承纯属演示,他们甚至没有一个模型),是坏的.

希望我错过了一些东西并且有一种很好的(非坏的)方法可以做到这一点,或者我上面提到的其中一种方法毕竟不是那么糟糕.

Tom*_*mmy 68

在我看来,最简单的方法是在<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="width=device-width" />
    <!-- Adding a RenderSection here, mark it as not required-->
    @RenderSection("AdditionalMeta", false)
    @Styles.Render("~/Content/css")
</head>
Run Code Online (Sandbox Code Playgroud)

现在,在您需要添加其他元数据的任何视图中,只需在视图文件的结尾/开头(模型声明之后)添加以下代码

@section AdditionalMeta
{
    <meta name="robots" content="noindex,nofollow"/>
}
Run Code Online (Sandbox Code Playgroud)

由于所有Razor的东西都是在服务器端进行处理的,因此在a)JS附加项目时会出现问题,因为有些爬虫不能实现JS而b)没有后期附加到<head>标签/ etc.此外,标记为不需要意味着您只需要更新您不想编入索引的页面,而不必在应用程序的每个页面上设置变量.

  • 谢谢!这个答案激励我编写一个关于如何从头开始实现动态元标记的分步教程.https://www.codebeaulieu.com/13/adding-meta-tags-dynamically (3认同)

Dan*_*.G. 8

您可以使用元标记将以下条件添加到<head>公共布局中的元素:

<!DOCTYPE html>
<html>
<head>
    <title>@ViewBag.Title</title>
    @if (PageData["DisableIndexing"])
    {
        <meta name="robots" content="noindex,nofollow"/>  
    }    
    ...
</head>
<body>
    ...
</body>
Run Code Online (Sandbox Code Playgroud)

默认情况下,该标志将在主_ViewStart.cshtml文件中设置为禁用,即Views文件夹中的标志.这意味着默认情况下,没有页面会添加该元标记.这将是_ViewStart文件:

@{
    Layout = "~/Views/Shared/_VanillaLayout.cshtml";
    PageData["DisableIndexing"] = false;
}
Run Code Online (Sandbox Code Playgroud)

最后,在要禁用索引的页面上,您只需要覆盖该标志.例如,如果Foo视图不允许索引,您可以:

@model MyNamespace.MyFooModel

@{
    ViewBag.Title = "Foo";
    PageData["DisableIndexing"] = true;
}
...
Run Code Online (Sandbox Code Playgroud)

如果某个文件夹中的所有视图都应禁用索引,您甚至可以将另一个_ViewStart.cshtml文件添加到您刚设置的文件夹中 PageData["DisableIndexing"] = true;

作为旁注,您还可以使用ViewBag将数据从_ViewStart传递到布局,但代码有点难看,因为您无法直接访问ViewStart中的ViewBag.如果您更喜欢使用ViewBag,请参阅此答案.

  • @acarlon,这是另一个好的和简单的方法.我虽然关于可选部分,但我决定采用这种方法,因为它可以避免在每个禁用索引的视图上重复元标记.但另一方面,Tommy的方法更简单,更清楚的是你添加到视图中的标签. (2认同)

Dil*_*165 7

如果您没有在布局页面中定义任何元标记,并且只是想从页面添加,那么您可以执行以下操作.

在您的布局页面_VanillaLayout.cshtml的head部分下使用@RenderSection如下

<head>
<meta charset="utf-8">    
@RenderSection("SeoRender", false)
</head>
Run Code Online (Sandbox Code Playgroud)

现在在您的视图页面中执行以下操作

@{
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">   
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以在页面中单独定义特定元标记和其他内容.