如何在Razor MVC中把XSLT变量传入OG标签的og:image属性?
既然你已经试过用jQuery动态添加标签但爬虫抓不到(毕竟Facebook调试器不执行JS),那核心思路就是让og:image标签在服务端渲染时就出现在HTML里,给你几个适配你现有环境的方案:
方案1:直接在XSLT中输出og:image标签(最快捷,权限要求低)
你已经有了能输出商品图片URL的$ProductImage变量,直接在XSLT生成<head>的部分添加上og:image的meta标签就行——因为XSLT是服务端生成HTML的,生成的标签会直接出现在初始HTML里,爬虫一抓就能看到。
在XSLT的<head>代码块里加这一行:
<meta property="og:image" content="{normalize-space($ProductImage)}" />
用normalize-space是为了去掉URL可能带的多余空格,避免解析出错。这个方法不需要改动Razor的Model或分部视图,只要能修改XSLT文件就能落地,完美适配你权限有限的情况。
方案2:把图片URL传递给Razor Model,统一生成OG标签
如果你希望所有OG标签都在Razor分部视图里统一管理,那可以在Razor层面调用和XSLT一样的aspdnsf:LookupProductImage方法来获取图片URL,赋值给Model的属性,再在分部视图里引用。
比如在你的Razor视图/控制器里:
// 确保你能拿到ProductID、ImageFilenameOverride、SKU这些必要参数 var productImage = AspDnsf.LookupProductImage(ProductID, ImageFilenameOverride, SKU, "large", 1, AltText); // 把图片URL赋值给Model的自定义属性(比如MetaImage) Model.MetaImage = productImage;
然后在.cshtml分部视图里添加og:image标签:
<meta property="og:image" content="@Model.MetaImage" />
这个方案更规范,所有OG标签都集中管理,但需要你能修改Model或者在Razor中调用那个aspdnsf的方法。
为什么jQuery方案不行?
Facebook的对象调试器(包括大部分搜索引擎爬虫)只会抓取页面的初始HTML内容,不会执行页面中的JavaScript代码。所以你用jQuery动态追加的meta标签,爬虫根本看不到,自然会提示缺失og:image。
内容的提问来源于stack exchange,提问作者ben.kaminski

