Как внедрить HTML на главной странице ASP.NET MVC - PullRequest
2 голосов
/ 04 августа 2010

У меня есть простая, но, вероятно, распространенная проблема в том, как внедрить HTML в главную страницу ASP.NET MVC. У меня есть код отслеживания Google Analytics, который находится на моей главной странице. Код выглядит так:

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 ]

4 голосов
/ 04 августа 2010

Мне кажется, я неправильно понял ваш первоначальный вопрос. Если это должно произойти только на одной странице, то добавление фильтра будет более «чистым» вариантом.

Фильтр:

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 - ваш друг для передачи информации из контроллера в мастер.

1 голос
/ 04 августа 2010

Можете ли вы разделить 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"] %>
<% } %>

Стоит попробовать?

0 голосов
/ 06 августа 2010

public override void OnActionExecuting(ActionExecutingContext filterContext) { MyController myController = (MyController)filterContext.Controller; myController.GetAnalyticsInfo(); base.OnActionExecuting(filterContext); }

0 голосов
/ 04 августа 2010

Я чувствую, что вы хотите, чтобы код GA применялся повсеместно на всех страницах?В этом случае вы можете абстрагировать идентификатор учетной записи в вспомогательный класс следующим образом:

public class Configuration {</p> <p>public string GoogleAnalyticsId { get { return "INSERT_ID_HERE"; } }</p> <p>}

Затем вы можете ссылаться на это в частичном представлении.Вставьте весь JS в файл .ascx (в разделе Views \ Shared)

var _gaq = _gaq || []; _gaq.push(['_setAccount', '<%=<strong>Configuration.GoogleAnalyticsId</strong>%>']); _gaq.push(['_trackPageview']); // need to inject ecommerce code here (function () { // google analytics code here })();

Теперь добавьте Html.Partial к своему мастеру

<%=Html.Partial("GoogleAnalyticsControl")%>

...