asp.net MVC-différentes vues ont besoin d'une balise meta différente dans la page de mise en page intérieure

Je voudrais empêcher certaines de mes pages d'apparaître dans les résultats de recherche. Je crois comprendre que j'Ajoute ce qui suit à la section <head> 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 head avec beaucoup de liens, de scripts et de balises meta. Je ne veux pas dupliquer cela pour les pages indexables et non indexables.

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

  • Ayant de multiples <head> sections est mauvais.
  • avoir la balise meta du robot à l'extérieur de head est mauvais.
  • utiliser des robots.txt est plus que ce que je veux et est mauvais.
  • essayer de passer un modèle dans la mise en page est un peu exagéré (besoin de tous les modèles pour hériter d'une base et de nombreuses pages sont purement présentation et n'ont même pas de modèle) et est mauvais.

J'espère qu'il me manque quelque chose et qu'il y a une bonne (non mauvaise) façon de le faire ou que l'une des approches que j'ai mentionnées ci-dessus n'est pas si mauvaise après tout.

32
demandé sur Community 2014-01-08 14:45:10

5 réponses

Il me semble que le moyen le plus simple serait de définir une section dans la balise <head> 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éta-données supplémentaires, ajoutez simplement le code suivant à la fin / au début (après les déclarations du modèle) de votre fichier de vue

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

Puisque tous les éléments de Razor sont traités côté serveur, il n'y aurait pas de problèmes dans a) ayant js ajouter des éléments étant donné que certains robots ne le font pas implémentez JS et b) pas d'ajout tardif à <head> tag / etc. En outre, être marqué comme non requis signifie que vous n'avez qu'à mettre à jour les pages que vous ne souhaitez pas indexer et ne pas avoir à définir une variable sur chaque page de votre application.

65
répondu Tommy 2014-01-08 11:43:02

Vous pouvez ajouter le conditionnel suivant avec la balise meta à l'élément <head> 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>

Cet indicateur sera défini comme désactivé par défaut dans votre fichier principal _ViewStart.cshtml, 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 voulez désactiver l'indexation, il vous suffit de remplacer cet indicateur. Par exemple, si la vue Foo ne doit pas autoriser l'indexation, vous faire:

@model MyNamespace.MyFooModel

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

Si toutes les vues d'un dossier doivent désactiver l'indexation, vous pouvez même ajouter un autre _ViewStart.fichier cshtml dans ce dossier où vous venez de définir PageData["DisableIndexing"] = true;

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

8
répondu Daniel J.G. 2017-05-23 11:54:26

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 de vue, 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">   
}

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

7
répondu Dilip0165 2014-01-08 11:36:04

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

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

Modifier:

Un autre essai pourrait être (selon ce Googlebot va-t-il analyser les modifications apportées au DOM avec JavaScript?) pour essayer avec JavaScript simple au lieu de la bibliothèque jquery

document.getElementsByTagName('head')[0].appendChild('<meta name="robots" content="noindex,nofollow"/>');
0
répondu theLaw 2017-05-23 12:10:03

Ancienne question, mais si cela peut aider quelqu'un, dans la disposition supérieure , j'ai dû utiliser:

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

Puis, dans chaque mises en page imbriquées , j'ai dû redéfinir ma section:

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

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

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

    @* or any other tag going to <head> *@
}
0
répondu AlexB 2017-08-31 13:27:11