2010-08-03 2 views
2

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

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

Что именно вы хотели бы сделать? Какая часть вас больше всего беспокоит? Насколько я понимаю, ваш вопрос в том, что код Google Analytics является постоянным для всего сайта, но код электронной коммерции на странице или что-то еще? –

+0

Вы можете написать фильтр, чтобы установить код GA в ViewData и поместить его в действие Receipt. (Я думаю, что это один из редких сценариев, когда уместно использовать ViewData.) Однако действительно, нет ничего плохого в том, чтобы оставить его внутри действия. – Ryan

+0

Да, электронная торговля предназначена только для страницы получения. – Keltex

ответ

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"] %> 
<% } %> 

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

+0

Немного хрупкий, но он будет работать! – Keltex

0

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

public class Configuration {

public string GoogleAnalyticsId { get { return "INSERT_ID_HERE"; } }

}

Вы можете ссылаться на это частичный вид. Нажмите весь JS в .ascx файл (в соображениях \ 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")%>

+0

Проблема в том, что вы по-прежнему не тянете код Google Analytics для конкретной квитанции. – Keltex

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

Было бы хорошо, если бы вы могли связать сильно типизированных ViewModel к MasterView но текущая структура MVC не позволяет что. ViewData - ваш друг за то, что он выталкивает информацию из контроллера в мастера.

+1

Для жизни я не могу правильно ее форматировать. :( – Praveen

+0

Поскольку GetAnalyticsInfo() требует доступа к модели, как бы получить эту информацию? – Keltex

+0

Когда вы говорите «Модель», вы имеете в виду ViewModel или DataModel? Я бы просто сохранил эту информацию в настройках приложения web.config или получить из базы данных конфигурации. – Praveen

0

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

Смежные вопросы