如何在ASP.NET MVC母版页上注入HTML

时间:2010-08-03 21:46:58

标签: asp.net asp.net-mvc master-pages google-analytics

关于如何在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);
}

这整个事情看起来像是一个小小的混乱,我想知道是否有人有更好的想法来处理这种情况?

4 个答案:

答案 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); }