【发布时间】:2011-07-15 20:56:46
【问题描述】:
我正在尝试使用 jQuery Mobile + MVC 3 来运行一个新的移动站点。其中一项要求是安装 Google Analytics 并正确跟踪页面浏览量。我像往常一样插入了 GA 代码,但它似乎只跟踪主页而没有跟踪其他网站页面。经过一番审查,看来我需要将 GA javascript 代码分成两个单独的块。所以,在元素中,我有这个:
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'xx-xxxxxx-x']);
(function () {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
然后,就在结束标记之前,我有这个:
<script type="text/javascript">
$('[data-role=page]').live('pageshow', function (event, ui) {
try {
_gaq.push(['_trackPageview', '@Model.RequestPath']);
} catch (err) { }
});
</script>
问题: @Model.RequestPath 总是返回“/”。我已经通过调试器看到该属性填充了适当的路径(即/somedirectory/somepage”),但是当它到达视图时,它只是得到一个“/”。
重要信息:
Model.RequestPath 配置为返回 Request.Url.AbsolutePath 的当前值。
更改内部页面的操作方法以将 RequestPath 属性设置为常量无效。就像它使用视图模型来填充页面(页面按预期呈现)但是 RequestPath 属性似乎在某个时候被修改了。我很困惑调试器如何显示它填充了正确的路径,但是当它到达视图时输出“/”。
我有两个页面:index.cshtml 是主页,也是提供的第一个页面。其余的内部页面使用 SiteMaster.cshtml。它们都有相同的 GA 代码。
当我加载页面时,调试器会针对我的请求执行控制器操作(如我所料),并且模型会填充正确的路径(但视图仍会输出“/”)。
当我在 FireFox 中执行“查看源代码”时,调试器会再次触发,但这次它会触发我主页的控制器操作。
我将 SiteMaster.cshtml 上的 GA 代码更改为调用“trackPageview1”,并将 index.cshtml 上的 GA 代码更改为调用“trackPageview2”,以便在查看源代码时可以看到正在调用的源代码。它总是 trackPageview2,这意味着它总是从 index.html 中提取,即使我在使用 SiteMaster.cshtml 布局文件的页面上。这将有助于解释为什么 RequestPath 总是“/”,但我仍然不明白为什么它不从主布局文件输出标记。
我很肯定这与 jQuery Mobile 以及它通过 AJAX 促进页面请求的方式有关,但我一直试图弄清楚这一点。在我继续自己研究的同时,我想我会发帖看看这里是否有人可以提供帮助。
如果有必要,我会在收到答案或找到更多信息时用更多细节来澄清这篇文章。
【问题讨论】:
-
尝试使用
@Request.Url.AbsoluteUri而不是@Model.RequestPath,看看渲染到页面的 URL 是否有任何不同。 -
我刚刚编辑了我的帖子,因为我意识到我忘了提到 Model.RequestPath 被配置为返回 Request.Url.AbsolutePath。我尝试在视图中用 Request.Url.AbsolutePath 替换 Model.RequestPath 并遇到相同的行为。
-
看我的回答。我在想你遇到了脚本冲突。您只需将 GA 代码放在布局页面上即可。
-
另外,试试
@Request.Url.AbsoluteUri而不是@Request.Url.AbsolutePath。 -
AbsoluteUri 只是输出协议和域名,而不是相对路径。所以不是所有页面上的“/”,而是所有页面上的“site.com”。
标签: c# jquery asp.net-mvc google-analytics jquery-mobile