web-dev-qa-db-ja.com

asp.net mvc-ビューごとにレイアウトページ内の<head>に異なるメタタグが必要

検索結果に私のページのいくつかが表示されないようにしたいと思います。私の理解では、<head>ページのセクション:

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

問題は、私のページが共通のレイアウトページを使用していることです。何かのようなもの:

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

レイアウトページ内には、多数のリンク、スクリプト、メタタグを含むヘッドセクションがあります。インデックス付け可能なページとインデックス付け不可能なページに対してこれを複製したくありません。

私の研究から、次のことがわかりました。-

  • 複数の<head>セクション悪い
  • ロボットメタタグを頭の外側に持つ悪い.
  • Robots.txtの使用は私が望む以上のものであり、悪いです。
  • モデルをレイアウトに渡そうとするのは少しやり過ぎです(すべてのモデルは何らかのベースから継承する必要があり、多くのページは純粋にプレゼンテーションであり、モデルさえありません)および- 悪い

うまくいけば、私は何かを逃しており、これを行うための良い(悪いではない)方法があるか、上記のアプローチのいずれかが結局それほど悪くはありません。

32
acarlon

私には、最も簡単な方法は<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>

さて、追加のメタデータを追加する必要があるビューでは、ビューファイルの最後/開始点(モデル宣言後)に次のコードを追加するだけです

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

すべてのRazorスタッフはサーバー側で処理されるため、a)JSにアイテムを追加しても、一部のクローラーがJSを実装しておらず、b)<head> tag/etc。また、不要とマークされているということは、インデックスを作成したくないページを更新するだけで、アプリケーションのすべてのページに変数を設定する必要がないことを意味します。

67
Tommy

共通のレイアウトの<head>要素に、メタタグを使用して次の条件を追加できます。

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

そのフラグは、Viewsフォルダーにあるメイン_ViewStart.cshtmlファイルでデフォルトで無効に設定されます。つまり、デフォルトでは、どのページにもそのメタタグは追加されません。これは_ViewStartファイルになります。

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

最後に、インデックス作成を無効にするページでは、そのフラグをオーバーライドするだけです。たとえば、Fooビューでインデックス作成を許可しない場合、次のようにします。

@model MyNamespace.MyFooModel

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

特定のフォルダー内のすべてのビューでインデックス作成を無効にする必要がある場合は、PageData["DisableIndexing"] = true;を設定するフォルダーに別の_ViewStart.cshtmlファイルを追加することもできます。

補足として、ViewBagを使用して_ViewStartからレイアウトにデータを渡すこともできますが、ViewStartでViewBagに直接アクセスできないため、コードは少し見苦しくなります。 ViewBagを使用する場合は、 この回答 を参照してください。

8
Daniel J.G.

レイアウトページでメタタグを定義しておらず、単にページから追加したい場合は、次のようにできます。

レイアウトページ_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">   
}

そのため、ページ内で特定のメタタグなどを個別に定義できます。

7
Dilip0165

古い質問ですが、それが誰かを助けるかもしれない場合、上のレイアウトで、私は使用しなければなりませんでした:

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

次に、everynested Layoutsで、セクションを再定義する必要がありました:

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

最後に、.cshtmlビューでセクションを定義しました:

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

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

Jqueryで試してください。インデックスを作成したくないページで、

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

編集:

別の試みは(これに応じて GooglebotはJavaScriptで行われたDOMの変更をクロールしますか? )jqueryライブラリの代わりに単純なjavascriptを試す

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