web-dev-qa-db-fra.com

asp.net mvc - différentes vues ont besoin d'une balise meta différente dans <head> à l'intérieur de la page de mise en page

Je voudrais empêcher certaines de mes pages de s'afficher dans les résultats de recherche. Je crois comprendre que j'ajoute ce qui suit au <head> section de la page:

<meta name="robots" content="noindex,nofollow"/>

Le problème est que mes pages utilisent une page de mise en page commune. Quelque chose comme:

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

À l'intérieur de la page de mise en page se trouve la section de tête avec beaucoup de liens, scripts et balises META. Je ne veux pas dupliquer cela pour les pages indexables et non indexables.

De mes recherches, j'ai trouvé que: -

  • Avoir plusieurs <head> sections est mauvais.
  • Avoir la balise META du robot à l'extérieur de la tête c'est mauvais.
  • Utiliser robots.txt est plus que ce que je veux et c'est mauvais.
  • Essayer de passer un modèle dans la mise en page est un peu exagéré (tous les modèles doivent hériter d'une base et de nombreuses pages sont purement de présentation et n'ont même pas de modèle) et - est mauvais.

Si tout va bien, il me manque quelque chose et il y a une bonne (non mauvaise) manière de faire ceci ou l'une des approches que j'ai mentionnées ci-dessus n'est pas si mauvaise après tout.

32
acarlon

Il me semble que la manière la plus simple serait de définir une section dans le <head> balise de votre fichier de mise en page que vous pouvez choisir de remplir avec des données dans vos vues

<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>

Maintenant, dans n'importe quelle vue dans laquelle vous devez ajouter des métadonnées supplémentaires, ajoutez simplement le code suivant à la fin/au début (après les déclarations de modèle) de votre fichier de vue

@section AdditionalMeta
{
    <meta name="robots" content="noindex,nofollow"/>
}

Étant donné que tous les éléments de Razor sont traités côté serveur, il n'y aurait aucun problème à a) avoir des éléments d'ajout JS étant donné que certains robots ne mettent pas en œuvre JS et b) pas d'ajout tardif à <head> tag/etc. De plus, le fait d'être marqué comme non requis signifie que vous n'avez qu'à mettre à jour les pages que vous ne souhaitez pas indexer et pas à définir une variable sur chaque page de votre application.

67
Tommy

Vous pouvez ajouter le conditionnel suivant avec la balise META au <head> élément dans votre mise en page commune:

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

Ce drapeau sera défini comme désactivé par défaut dans votre _ _ViewStart.cshtml fichier, celui du dossier Vues. Cela signifierait par défaut qu'aucune page n'ajoutera cette balise META. Ce sera le fichier _ViewStart:

@{
    Layout = "~/Views/Shared/_VanillaLayout.cshtml";
    PageData["DisableIndexing"] = false;
}

Enfin, sur les pages où vous souhaitez désactiver l'indexation, il vous suffit de remplacer cet indicateur. Par exemple, si la vue Foo ne doit pas autoriser l'indexation, vous feriez:

@model MyNamespace.MyFooModel

@{
    ViewBag.Title = "Foo";
    PageData["DisableIndexing"] = true;
}
...

Si toutes les vues d'un certain dossier devaient désactiver l'indexation, vous pourriez même ajouter un autre fichier _ViewStart.cshtml à ce dossier où vous définiriez simplement PageData["DisableIndexing"] = true;

En guise de remarque, vous pouvez également utiliser le ViewBag pour transmettre des données du _ViewStart à la mise en page, mais le code est un peu moche car vous n'avez pas un accès direct au ViewBag dans le ViewStart. Voir cette réponse si vous préférez utiliser le ViewBag.

8
Daniel J.G.

Si vous ne définissez aucune balise META dans la page de mise en page et que vous souhaitez simplement ajouter à partir de votre page, vous pouvez procéder comme suit.

dans votre page de mise en page _VanillaLayout.cshtml sous la section head, utilisez @RenderSection comme suit

<head>
<meta charset="utf-8">    
@RenderSection("SeoRender", false)
</head>

Maintenant, dans votre page d'affichage, procédez comme suit

@{
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">   
}

Ainsi, vous pouvez définir une balise META spécifique et autre chose individuellement dans votre page.

7
Dilip0165

Vieille question, mais si cela peut aider quelqu'un, dans la disposition supérieure , je devais utiliser:

<head>
    @RenderSection("MySection", required:false)
</head>

Ensuite, dans every Layouts imbriqués , j'ai dû redéfinir ma section:

@section MySection {
    @RenderSection("MySection", false)
}

Enfin, j'ai défini ma section dans mon .cshtml vue :

@section MySection{
    <meta name="robots" content="@Model.MetaContent"/>  

    @* or any other tag going to <head> *@
}
0
AlexB

Essayez avec Jquery, dans la page que vous ne souhaitez pas indexer, ajoutez

$('head').append('<meta name="robots" content="noindex,nofollow"/>');

Éditer:

un autre essai pourrait être (selon cela Googlebot explorera-t-il les modifications apportées au DOM avec JavaScript? ) pour essayer avec du javascript simple au lieu de la bibliothèque jquery

document.getElementsByTagName('head')[0].appendChild('<meta name="robots" content="noindex,nofollow"/>');
0
theLaw