结合 asp.net mvc 正确使用微数据项范围
Correct usage of microdata itemscopes in combination with asp.net mvc
因为我正在使用 asp.net MVC,所以视图在我的 body 中使用 @RenderBody()
呈现
我的问题是:我是否正确使用了 schema.org 微数据?
在我的示例中,我有 html,它是 WebSite,它在 header 中有一些元数据用于 WebSite itemscope。
接下来,我将 mainEntityOfPage 设置为 WebPage 并添加 header,页脚。
将出现在 @RenderBody() 中的一些页面具有自己的范围(例如 ContactPage),而其他页面仅具有包含 Product 或 Place 的某些项目范围的数据。
这是使用微数据的正确方法吗?
简化_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() 中,因此在没有任何其他项目范围的网页项目范围中:
<div class="...">
@* content *@
</div>
简化的 Contact.cshtml(主页)显示在 @RenderBody() 中,因此在具有其他范围的网页项目范围中:
<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>
更新:
这是我现在拥有的:
<!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>
由于 Index.cshtml 中没有模式标记,我将在插入 _Layout.cshtml 时讨论 Contact.cshtml。这适用于 Index.cshtml,除非引用 Contact.cshtml.
中的内容
模式标记读取如下:
- 网站
- mainEntityOfPage: 网页
- WPHeader
- SiteNavigationElement
- 联系页面
- 地点
- WPFooter
标记存在许多问题,包括但不限于页面上的项目缺乏层次结构和不正确的 schema.org 用法。我将在下面逐行讨论您的代码:
<!DOCTYPE html>
<html itemscope itemtype="http://schema.org/WebSite">
此标记表明此页面上的 HTML 是一个网站 站点 。这很好,但可能不是您想要的。术语对于模式标记很重要——也许这应该是一个网页?我稍后会回来讨论这个。
<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(这个单页)mainEntity(这个单页的主要内容)是 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 会将 link 从网页删除到网站,并且由于您没有使用任何网站属性,因此可以删除网站架构。
<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>
这是两个完全独立的模式。它们彼此不关联,也不与网页模式关联。您在这两个上都缺少 itemprop 属性。它们都应包含 itemprop="hasPart"
以定义以下层次结构:
- 网页
- hasPart: WPHeader
- 有部分:SiteNavigationElement
<div class="banner">
@* banner stuff *@
</div>
<div class="myMiddleContent" itemscope itemtype="http://schema.org/ContactPage">
这有点困难,因为 ContactPage 是一个 WebPage,但您已经在 WebPage 的范围内并且它本身并不是一个不同的页面。通常你会 link 这两个与 itemprop="mainEntity"
但项目类型是网页,所以这是不正确的。 mainContentOfPage 用于 WebPageElement,但您又定义了整个页面。
这是 WebPage 架构应替换为 ContactPage 的地方,但我知道您“插入”到 @RenderBody()
不适合这个。我想 mainEntity 是您可以做的最好的,如果您不能根据您插入的页面更改 WebPage 架构(WebPage 仍然是 Index.cshtml 最合适的架构)。如果您能够在插入联系人页面时更改布局页面,则应将 WebPage 更改为 ContactPage,而不是使用 mainEntity。由于稍后讨论的联系人页面中的架构适用于 ContactPage 架构,因此您以后不需要进行任何进一步的更改。
假设您在插入联系人页面时无法更改布局页面,到目前为止的架构如下:
- 网页
- hasPart: WPHeader
- 有部分:SiteNavigationElement
- 主要实体:联系人页面
<div class="container">
<div class="row">
@*...*@
<div class="col-md-6" itemscope itemtype="http://schema.org/Place">
到目前为止,这个地方与任何地方都完全不同——同样,这个模式中缺少一个 itemprop。使用 contentLocation(或定义一个 Organization/etc 来包含地点)。然后,你会得到...
- 网页
- hasPart: WPHeader
- 有部分:SiteNavigationElement
- mainEntity:联系人页面
- 内容位置:地点
@*...*@
</div>
</div>
</div>
</div>
<div>
@* some other stuff*@
</div>
<div class="myfooter" itemscope itemtype="http://schema.org/WPFooter">
与 WPHeader 一样,WPFooter 缺少 hasPart。完成的架构如下所示:
- 网页
- hasPart: WPHeader
- 有部分:SiteNavigationElement
- mainEntity:联系人页面
- 内容位置:地点
- 有零件:WPFooter
如果您可以在插入联系人页面时更改布局页面,架构如下所示:
- 联系页面
- hasPart: WPHeader
- 有部分:SiteNavigationElement
- 内容位置:地点
- 有零件: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 结构化数据测试工具无法正确显示此内容,因为某些项目缺少内容。
因为我正在使用 asp.net MVC,所以视图在我的 body 中使用 @RenderBody()
呈现
我的问题是:我是否正确使用了 schema.org 微数据?
在我的示例中,我有 html,它是 WebSite,它在 header 中有一些元数据用于 WebSite itemscope。 接下来,我将 mainEntityOfPage 设置为 WebPage 并添加 header,页脚。 将出现在 @RenderBody() 中的一些页面具有自己的范围(例如 ContactPage),而其他页面仅具有包含 Product 或 Place 的某些项目范围的数据。
这是使用微数据的正确方法吗?
简化_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() 中,因此在没有任何其他项目范围的网页项目范围中:
<div class="...">
@* content *@
</div>
简化的 Contact.cshtml(主页)显示在 @RenderBody() 中,因此在具有其他范围的网页项目范围中:
<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>
更新:
这是我现在拥有的:
<!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>
由于 Index.cshtml 中没有模式标记,我将在插入 _Layout.cshtml 时讨论 Contact.cshtml。这适用于 Index.cshtml,除非引用 Contact.cshtml.
中的内容模式标记读取如下:
- 网站
- mainEntityOfPage: 网页
- WPHeader
- SiteNavigationElement
- 联系页面
- 地点
- WPFooter
标记存在许多问题,包括但不限于页面上的项目缺乏层次结构和不正确的 schema.org 用法。我将在下面逐行讨论您的代码:
<!DOCTYPE html> <html itemscope itemtype="http://schema.org/WebSite">
此标记表明此页面上的 HTML 是一个网站 站点 。这很好,但可能不是您想要的。术语对于模式标记很重要——也许这应该是一个网页?我稍后会回来讨论这个。
<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(这个单页)mainEntity(这个单页的主要内容)是 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 会将 link 从网页删除到网站,并且由于您没有使用任何网站属性,因此可以删除网站架构。
<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>
这是两个完全独立的模式。它们彼此不关联,也不与网页模式关联。您在这两个上都缺少 itemprop 属性。它们都应包含 itemprop="hasPart"
以定义以下层次结构:
- 网页
- hasPart: WPHeader
- 有部分:SiteNavigationElement
- hasPart: WPHeader
<div class="banner"> @* banner stuff *@ </div> <div class="myMiddleContent" itemscope itemtype="http://schema.org/ContactPage">
这有点困难,因为 ContactPage 是一个 WebPage,但您已经在 WebPage 的范围内并且它本身并不是一个不同的页面。通常你会 link 这两个与 itemprop="mainEntity"
但项目类型是网页,所以这是不正确的。 mainContentOfPage 用于 WebPageElement,但您又定义了整个页面。
这是 WebPage 架构应替换为 ContactPage 的地方,但我知道您“插入”到 @RenderBody()
不适合这个。我想 mainEntity 是您可以做的最好的,如果您不能根据您插入的页面更改 WebPage 架构(WebPage 仍然是 Index.cshtml 最合适的架构)。如果您能够在插入联系人页面时更改布局页面,则应将 WebPage 更改为 ContactPage,而不是使用 mainEntity。由于稍后讨论的联系人页面中的架构适用于 ContactPage 架构,因此您以后不需要进行任何进一步的更改。
假设您在插入联系人页面时无法更改布局页面,到目前为止的架构如下:
- 网页
- hasPart: WPHeader
- 有部分:SiteNavigationElement
- 主要实体:联系人页面
- hasPart: WPHeader
<div class="container"> <div class="row"> @*...*@ <div class="col-md-6" itemscope itemtype="http://schema.org/Place">
到目前为止,这个地方与任何地方都完全不同——同样,这个模式中缺少一个 itemprop。使用 contentLocation(或定义一个 Organization/etc 来包含地点)。然后,你会得到...
- 网页
- hasPart: WPHeader
- 有部分:SiteNavigationElement
- mainEntity:联系人页面
- 内容位置:地点
- hasPart: WPHeader
@*...*@ </div> </div> </div> </div> <div> @* some other stuff*@ </div> <div class="myfooter" itemscope itemtype="http://schema.org/WPFooter">
与 WPHeader 一样,WPFooter 缺少 hasPart。完成的架构如下所示:
- 网页
- hasPart: WPHeader
- 有部分:SiteNavigationElement
- mainEntity:联系人页面
- 内容位置:地点
- 有零件:WPFooter
- hasPart: WPHeader
如果您可以在插入联系人页面时更改布局页面,架构如下所示:
- 联系页面
- hasPart: WPHeader
- 有部分:SiteNavigationElement
- 内容位置:地点
- 有零件:WPFooter
- hasPart: WPHeader
修改后的代码(包括修复<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 结构化数据测试工具无法正确显示此内容,因为某些项目缺少内容。