如何在ASP.NET MVC母版页上插入HTML
关于如何在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
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访问控制器。更新:请参阅下面我的答案中的代码。