关于如何在ASP.NET MVC母版页中注入HTML,我有一个简单但可能很常见的问题。我有一个谷歌分析跟踪代码,位于我的母版页上。代码如下所示:
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXX-1']);
_gaq.push(['_trackPageview']);
// need to inject ecommerce code here
(function () {
// google analytics code here
})();
我正在使用电子商务跟踪,我想在收据页面上的此HTML中注入“购物车”信息(仅在此页面上)。所以我做了这样的事情:
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXX-1']);
_gaq.push(['_trackPageview']);
<% if(ViewData["googleanalytics"]!=null) {%>
<%= ViewData["googleanalytics"] %>
<% } %>
(function () {
// google analytics code here
})();
然后在控制器中,我的代码如下所示:
[HttpGet]
public ActionResult Receipt()
{
var receipt = // get receipt model
// get google analytics javascript. This function pulls
// the data from the receipt model
ViewData["googleanalytics"] = GetAnalyticsInfo(receipt);
return View(receipt);
}
这整个事情看起来像是一个小小的混乱,我想知道是否有人有更好的想法来处理这种情况?
答案 0 :(得分:4)
我想我误解了你原来的问题。如果这只发生在一个页面上,那么添加过滤器将是一个“更清洁”的选项。
过滤强>
public sealed class GAFilter: ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.Controller.ViewData["googleanalytics"] = GetAnalyticsInfo();
base.OnActionExecuting(filterContext);
}
private MvcHtmlString GetAnalyticsInfo()
{
}
}
<强>动作:强>
[GA]
public ActionResult ()
{
return View();
}
如果您可以将强类型视图模型绑定到MasterView,但当前的MVC框架不允许这样做,那将是很好的。 ViewData是您将信息从Controller推送到Master中的朋友。
答案 1 :(得分:1)
你能否将javascript分成两部分:
在母版页的顶部,输入:
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXX-1']);
_gaq.push(['_trackPageview']);
在母版页的底部,输入:
(function () {
// google analytics code here
})();
然后,在收据页面的某个视图中(将在主页面的两段javascript之间输出),放
<% if(ViewData["googleanalytics"]!=null) {%>
<%= ViewData["googleanalytics"] %>
<% } %>
值得一试?
答案 2 :(得分:0)
我觉得您希望GA代码能够在所有页面上全面应用吗?在这种情况下,您可以将帐户ID抽象为辅助类,如下所示:
public class Configuration
{
public string GoogleAnalyticsId
{
get
{
return "INSERT_ID_HERE";
}
}
}
然后,您可以在局部视图中引用它。将整个JS推送到.ascx文件(在Views \ Shared下)
var _gaq = _gaq || [];
_gaq.push(['_setAccount', '<%=Configuration.GoogleAnalyticsId%>']);
_gaq.push(['_trackPageview']);
// need to inject ecommerce code here
(function () {
// google analytics code here
})();
现在,将Html.Partial添加到主人
<%=Html.Partial("GoogleAnalyticsControl")%>
答案 3 :(得分:0)
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
MyController myController = (MyController)filterContext.Controller;
myController.GetAnalyticsInfo();
base.OnActionExecuting(filterContext);
}