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

 itlzk 发布于 2023-02-05 11:24

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


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

@{
    Layout = "~/Views/Shared/_VanillaLayout.cshtml";
}

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

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

有多个部分很糟糕.

机器人元标记在头部之外是不好的.

使用robots.txt比我想要的还多,而且很糟糕.

试图通过模型到布局是有点矫枉过正的(需要的所有车型,从一些基本的和多页继承纯属演示,他们甚至没有一个模型),是坏的.

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

3 个回答
  • 您可以使用元标记将以下条件添加到<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,请参阅此答案.

    2023-02-05 11:26 回答
  • 在我看来,最简单的方法是在<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.此外,标记为不需要意味着您只需要更新您不想编入索引的页面,而不必在应用程序的每个页面上设置变量.

    2023-02-05 11:26 回答
  • 如果您没有在布局页面中定义任何元标记,并且只是想从页面添加,那么您可以执行以下操作.

    在您的布局页面_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">   
    }
    

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

    2023-02-05 11:26 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有