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

如何在ASP.NET MVC母版页上插入HTML,asp.net,asp.net-mvc,master-pages,google-analytics,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

关于如何在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
})();
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);
}
我正在使用电子商务跟踪,我想将“购物车”信息注入收据页面(仅此页面)的HTML中。所以我做了这样的事情:

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXX-1']);
_gaq.push(['_trackPageview']);
// need to inject ecommerce code here
(function () {
    // google analytics code here
})();
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);
}

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

我觉得你希望GA代码在所有页面上都得到应用?在这种情况下,您可以将帐户ID抽象为帮助器类,如下所示:


公共类配置
{

公共字符串GoogleAnalyticsId { 得到 { 返回“在此处插入ID”; } }

}

然后,您可以在局部视图中引用它。将整个JS推入.ascx文件(在Views\Shared下)


var _gaq=_gaq | |[];
_gaq.push([''设置帐户','');
_gaq.push([''u trackPageview']);
//需要在这里注入电子商务代码
(功能(){
//谷歌分析代码在这里
})();

现在,添加一个Html.Partial到你的master


能否将javascript分为两部分:

在母版页顶部,放置:

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXX-1']);
_gaq.push(['_trackPageview']);
(function () {
    // google analytics code here
})();
在母版页底部,放置:

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXX-1']);
_gaq.push(['_trackPageview']);
(function () {
    // google analytics code here
})();
然后,在收据页面视图的某个地方(它将在母版页的两段javascript之间输出),放置



值得一试吗?

我想我误解了你原来的问题。如果这只能发生在一个页面上,那么添加一个过滤器将是一个“更干净”的选项

过滤器:

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();
}
行动:

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();
}
如果您可以将强类型viewmodel绑定到MasterView,那就太好了,但是当前的MVC框架不允许这样做。ViewData是您将信息从控制器推送到主机的朋友。


公共覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
{
MyController MyController=(MyController)filterContext.Controller;
myController.GetAnalyticsInfo();
base.OnActionExecuting(filterContext);
}

您到底想做什么?哪一部分最困扰你?据我所知,你的问题是Google Analytics代码对整个网站来说是恒定的,但电子商务代码是每页还是其他?你可以编写一个过滤器,在ViewData中设置GA代码,并将其放在收据操作上。(我认为这是极少数适合使用ViewData的场景之一。)但将其保留在操作中并没有什么错。是的,电子商务只用于收据页面。问题是您仍然没有提取特定收据的google分析代码。因为GetAnalyticsInfo()需要访问模型,如何获取此信息?当您说模型时,您指的是ViewModel还是DataModel?我只想将这些信息保存在web.config的应用程序设置中,或者从config数据库获取。为了论证起见,让我们假设ViewModel。关键是GetAnalyticsInfo()必须返回用户特定的收据信息。根据我的理解,主视图没有ViewModel,因为一个视图只能有一个ViewModel。您可以通过ActionExecutingContext访问控制器。更新:请参阅下面我的答案中的代码。