2016-03-18 8 views
1

Так как я использую asp.net MVC мнения визуализируются в моем теле с помощью @RenderBody()
Мой вопрос: я правильно используя схему. org microdata?Правильное использование микроданных itemscopes в сочетании с ASP.NET MVC

В моем примере у меня есть html, который является WebSite, он имеет некоторые метаданные в заголовке для объектов WebSite itemscope. Затем я устанавливаю mainEntityOfPage в WebPage и добавляю верхний колонтитул. Некоторые страницы, которые будут отображаться в @RenderBody(), имеют собственную область действия (например, ContactPage), а другие имеют только данные с некоторыми предметами предметов продукта или места.

Это правильный способ использования микроданных?

упрощенный _Layout.cshtml

<!DOCTYPE html> 
<html itemscope itemtype="http://schema.org/WebSite"> 
<head prefix="og: http://ogp.me/ns#"> 
    <meta property="og:title" content="test"> 
    <meta itemprop="about" content="test"> 
</head> 
<body itemprop="mainEntityOfPage" itemscope itemtype="http://schema.org/WebPage"> 

    <div class="myheader" itemscope itemtype="http://schema.org/WPHeader"> 
     <div class="..."> 
      <nav class="navbar navbar-default navbarwrapper" itemscope itemtype="http://schema.org/SiteNavigationElement"> 
       @*...*@ 
      </div> 
     </div> 
    </div> 

    @RenderBody() 

    <div> 
     @* some other stuff*@ 
    </div> 

     <div class="myfooter" itemscope itemtype="http://schema.org/WPFooter"> 
     @*...*@ 
     </div> 
</body> 

упрощенный Index.cshtml (Главная), который показан в @RenderBody(), и, следовательно, на веб-странице itemscope без каких-либо других itemscopes:

<div class="..."> 
@* content *@  
</div> 

Упрощенный Contact.cshtml (Home), который показан в @RenderBody() и, следовательно, в объекте WebPage с другими областями:

<div class="banner"> 
    @* banner stuff *@ 
    </div> 
    <div class="myMiddleContent" itemscope itemtype="http://schema.org/ContactPage"> 
    <div class="container"> 
     <div class="row"> 
       @*...*@ 

       <div class="col-md-6" itemscope itemtype="http://schema.org/Place"> 
       @*...*@ 
       </div> 
      </div> 
     </div> 
    </div> 

UPDATE:

Это то, что я есть сейчас:

<!DOCTYPE html> 
<html itemscope itemtype="http://schema.org/WebSite"> 
<head prefix="og: http://ogp.me/ns#"> 
    <meta property="og:title" content="test"> 
    <meta itemprop="about" content="test"> 
    <meta itemprop="headline" content="my fancy pancy site"> 
    <meta itemprop="cool, things here"> 
</head> 
<body itemprop="mainEntity" itemscope itemtype="http://schema.org/ContactPage"> @* or /WebPage *@ 

    <div class="myheader" itemprop="hasPart" itemscope itemtype="http://schema.org/WPHeader"> 
     <div class="..."> 
      <nav class="navbar navbar-default navbarwrapper" itemprop="hasPart" itemscope itemtype="http://schema.org/SiteNavigationElement"> 
       @*...*@ 
      </div> 
     </div> 
    </div> 



    @* injected via @RenderBody() *@ 
    <div class="banner"> 
    @* banner stuff *@ 
    </div> 
    <div class="myMiddleContent"> 
    <div class="container"> 
     <div class="row"> 
       @* list of products...*@ 

       <div class="col-md-6" itemscope itemtype="http://schema.org/Product"> 
       @*product x...*@ 
       </div> 
       <div class="col-md-6" itemscope itemtype="http://schema.org/Product"> 
       @* product y...*@ 
       </div> 
      </div> 
     </div> 
    </div> 
    <div itemprop="contentLocation" itemscope itemtype="http://schema.org/Museum"> 
     <link itemprop="additionalType" href="http://schema.org/TouristAttraction"> 
     <meta itemprop="name" content="Foo bar"> 
     <meta itemprop="sameAs" content="http://www.facebook.com/FooBar"> 
      <div itemprop="openingHoursSpecification" itemscope itemtype="http://schema.org/OpeningHoursSpecification"> 
      @*...*@ 
      </div> 
    </div> 
    @* end of injected via @RenderBody() *@ 


    <div> 
     @* some other stuff*@ 
    </div> 

    <div class="myfooter" itemprop="hasPart" itemscope itemtype="http://schema.org/WPFooter"> 
     @*...*@ 
    </div> 

    @*website/webpage creator/author/etc... *@  
    <div itemprop="creator" itemscope itemtype="http://schema.org/LocalBusiness"> 
     <meta itemprop="name" content="..."> 
     @*...*@ 
    </div> 
    <div itemprop="copyrightHolder" itemscope itemtype="http://schema.org/LocalBusiness"> 
     @*...*@ 
    </div> 

</body> 
</html> 
+0

Я не думаю, что с вашим подходом что-то не так. Я предлагаю запустить вашу визуализированную страницу через валидатор и проверить, соответствует ли результат. –

+0

Я использовал google, yandex и т. Д., Но один говорит вам, что это неправильно, другие говорят вам, что это правильно. но я не знаю, если это потому, что они не поддерживают все или если это неправильно или ... – juFo

+0

Хм, я думаю, это зависит от ошибки. Я нахожу, что google поддерживает большинство элементов. –

ответ

1

В Index.cshtml нет схемы разметки внутри, я буду говорить о Contact.cshtml при вставке в _Layout.cshtml. Это относится к Index.cshtml, за исключением случаев обращения к контенту в Contact.cshtml.

Разметка схема следующим образом:

  • WebSite
    • mainEntityOfPage: WebPage
  • WPHeader
  • SiteNavigationElement
  • ContactPage
  • P кружева
  • WPFooter

Есть целый ряд проблем, связанных с разметкой, в том числе, но не ограничиваясь отсутствием иерархической организации элементов на странице и неправильное использование schema.org. Я буду обсуждать свой код построчно ниже:

<!DOCTYPE html> 
<html itemscope itemtype="http://schema.org/WebSite"> 

Эта разметка сообщает, что HTML на этой странице веб-сайта . Это нормально, но может и не быть тем, что вы намерены. Терминология важна с разметкой схемы - возможно, это должен быть WebPage? Я вернусь к этому позже.

<head prefix="go: http://ogp.me/ns#"> 
    <meta property="og:title" content="test"> 
    <meta itemprop="about" content="test"> 
</head> 
<body itemprop="mainEntityOfPage" itemscope itemtype="http://schema.org/WebPage"> 

Здесь вы о том, что веб-сайт является mainEntityOfPage: WebPage. Это почти наверняка не то, что вы намеревались. Чтобы уточнить, вы говорите, что главная страница WebPage (эта единственная страница) (основное содержимое этой отдельной страницы) - это WebSite (весь сайт). Я рекомендую вам проверить schema.org/mainEntityOfPage для уточнения этого свойства. Вот что я хотел бы сделать вместо:

<!DOCTYPE html> 
<html> 
<head prefix="og: http://ogp.me/ns#"> 
    <meta property="og:title" content="test"> 
    <meta itemprop="about" content="test"> 
</head> 
<body itemscope itemtype="http://schema.org/WebPage"> 

Удаление itemprop удаляет ссылку с веб-страницы на веб-сайт, и как вы не используете какие-либо свойства веб-сайта схемы WebSite могут быть удалены.

<div class="myheader" itemscope itemtype="http://schema.org/WPHeader"> 
    <div class="..."> 
     <nav class="navbar navbar-default navbarwrapper" itemscope itemtype="http://schema.org/SiteNavigationElement"> 
      @*...*@ 
     </div> 
    </div> 
</div> 

Это две совершенно разные схемы. Они не связаны друг с другом, ни с помощью схемы WebPage. Вам не хватает атрибута itemprop для обоих этих параметров. Оба они должны включать itemprop="hasPart" определить следующую иерархию:

  • WebPage
    • hasPart: WPHeader
      • hasPart: SiteNavigationElement
<div class="banner"> 
    @* banner stuff *@ 
    </div> 
    <div class="myMiddleContent" itemscope itemtype="http://schema.org/ContactPage"> 

Это немного сложно, потому что ContactPage - это WebPage, но вы уже находитесь в сфере WebPage, и это не другая страница как таковая. Обычно вы связываете эти два с itemprop="mainEntity", но тип элемента - это WebPage, поэтому это неверно. mainContentOfPage для WebPageElement, но вы снова определили целую страницу.

Здесь схема WebPage должна быть заменена ContactPage, но я понимаю, что ваш «drop-in» to @RenderBody() не учитывает это. Я предполагаю, что mainEntity - это лучшее, что вы можете сделать, если вы не можете изменить схему WebPage на основе той страницы, которую вы вставляете (WebPage по-прежнему является наиболее подходящей схемой для Index.cshtml). Если вы : можете изменить страницу макета при вставке страницы контакта, вам следует изменить веб-страницу на ContactPage, а не использовать mainEntity. Поскольку схема на странице контактов, как описано ниже, применяется к схеме ContactPage, вам не нужно вносить дальнейшие изменения позже.

Схема до сих пор, предполагая, что вы не можете изменить макет страницы при вставке страницы контакта, является следующее:

  • WebPage
    • hasPart: WPHeader
      • hasPart: SiteNavigationElement
    • mainEntity: ContactPage
<div class="container"> 
    <div class="row"> 
      @*...*@ 

      <div class="col-md-6" itemscope itemtype="http://schema.org/Place"> 

Это место полностью отделено от чего-либо до сих пор - опять же, itemprop отсутствует из этой схемы. Используйте contentLocation (или определите Организацию/etc, чтобы содержать Место). Затем, вы будете в конечном итоге с ...

  • WebPage
    • hasPart: WPHeader
      • hasPart: SiteNavigationElement
    • mainEntity: ContactPage
      • contentLocation: Место
   @*...*@ 
      </div> 
     </div> 
    </div> 
</div> 

<div> 
    @* some other stuff*@ 
</div> 

    <div class="myfooter" itemscope itemtype="http://schema.org/WPFooter"> 

Как WPHeader, WPFooter отсутствует hasPart.Готовая схема выглядит следующим образом:

  • WebPage
    • hasPart: WPHeader
      • hasPart: SiteNavigationElement
    • mainEntity: ContactPage
      • contentLocation: Место
    • hasPart: WPFooter

Если вы можете изменить макет страницы при вставке страницы контакта, схема выглядит следующим образом:

  • ContactPage
    • имеетПарт: WPHeader
      • hasPart: SiteNavigationElement
    • contentLocation: Место
    • hasPart: WPFooter

Скорректированный код (в том числе фиксации <nav></div>) выглядит следующим образом:

<!DOCTYPE html> 
<html> 
<head prefix="og: http://ogp.me/ns#"> 
    <meta property="og:title" content="test"> 
    <meta itemprop="about" content="test"> 
</head> 
<body itemscope itemtype="http://schema.org/WebPage"> 

    <div class="myheader" itemprop="hasPart" itemscope itemtype="http://schema.org/WPHeader"> 
     <div class="..."> 
      <nav class="navbar navbar-default navbarwrapper" itemprop="hasPart" itemscope itemtype="http://schema.org/SiteNavigationElement"> 
       @*...*@ 
      </nav> 
     </div> 
    </div> 

    @RenderBody() 

    <div> 
     @* some other stuff*@ 
    </div> 

     <div class="myfooter" itemprop="hasPart" itemscope itemtype="http://schema.org/WPFooter"> 
     @*...*@ 
     </div> 
</body> 
<div class="banner"> 
    @* banner stuff *@ 
</div> 
<div class="myMiddleContent" itemprop="hasPart" itemscope itemtype="http://schema.org/ContactPage"> 
<div class="container"> 
    <div class="row"> 
      @*...*@ 
      <div class="col-md-6" itemprop="contentLocation" itemscope itemtype="http://schema.org/Place"> 
       @*...*@ 
      </div> 
     </div> 
    </div> 
</div> 

Инструмент Google Structured Data Testing Tool не покажет это правильно, так как некоторые элементы не содержат содержимого.

+0

Спасибо, угадайте, что schema.org нужны образцы «реальной жизни»! – juFo

+0

Можно ли добавить тег для добавления itemprop = "headline" и т. Д.?? – juFo

+0

@juFo Да, но может быть предпочтительнее использовать свойство заголовка с WebPage в зависимости от обстоятельств. – grgarside