jQuery Mobile + MVC 3 + Request.Path - PullRequest
       1

jQuery Mobile + MVC 3 + Request.Path

2 голосов
/ 15 марта 2011

Я пытаюсь использовать jQuery Mobile + MVC 3 для запуска нового мобильного сайта.Одним из требований является установка Google Analytics и правильное отслеживание просмотров страниц.Я вставил код GA, как обычно, но, похоже, он отслеживает только домашнюю страницу и ни одну из других страниц сайта.После некоторого обзора кажется, что я должен разделить код JavaScript JavaScript GA на два отдельных блока.Итак, в элементе у меня есть это:

<script type="text/javascript">
        var _gaq = _gaq || [];
        _gaq.push(['_setAccount', 'xx-xxxxxx-x']);
        (function () {
            var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
            ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
            var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
        })();
  </script>

Затем, непосредственно перед закрывающим тегом у меня есть это:

<script type="text/javascript">
    $('[data-role=page]').live('pageshow', function (event, ui) {
        try {
            _gaq.push(['_trackPageview', '@Model.RequestPath']);
        } catch (err) { }
    });
</script>

Проблема: @Model.RequestPath ВСЕГДА возвращает "/".Я прошел через отладчик и увидел, что свойство заполняется соответствующим путем (например, / somedirectory / somepage "), но когда оно попадает в представление, оно просто получает" / ".

Важная информация:

  • Model.RequestPath настроен для возврата текущего значения Request.Url.AbsolutePath.

  • ИзменениеМетод действия внутренней страницы, устанавливающий для свойства RequestPath какое-либо постоянное значение, не имеет никакого эффекта, как будто он использует модель представления для заполнения страницы (страница отображается так, как ожидалось), но свойство RequestPath, похоже, модифицируется в какой-то момент.Я запутался в том, как отладчик показывает, что он заполнен правильным путем, но затем выводит "/", когда он попадает в представление.

  • У меня есть две страницы: index.cshtmlкоторая является домашней страницей и является первой обслуживаемой страницей. Остальные внутренние страницы используют SiteMaster.cshtml. Они имеют одинаковый код GA.

  • Когда я загружаю tНа этой странице отладчик выполняет действие контроллера для моего запроса (как я и ожидал), и модель заполняется правильным путем (однако представление по-прежнему выводит "/").

  • Когда я выполняю «Просмотр исходного кода» в FireFox, отладчик запускается снова, за исключением этого времени, когда он выполняет действие контроллера для моей домашней страницы.

  • Я изменил код GA на SiteMaster.cshtmlдля вызова «trackPageview1» и в index.cshtml для вызова «trackPageview2» просто так, чтобы я мог видеть при выполнении источника представления, какой из них вызывается.Это ВСЕГДА trackPageview2, что означает, что он всегда тянет из index.html, даже когда я нахожусь на странице, которая использует файл макета SiteMaster.cshtml.Это поможет объяснить, почему RequestPath всегда "/", но я до сих пор не понимаю, почему он не выводит разметку из файла основного макета.

Я уверен, что этоимеет какое-то отношение к jQuery Mobile и способу, которым он облегчает запросы страниц через AJAX, но я застрял, пытаясь понять это.Думаю, что я опубликую и посмотрю, сможет ли кто-нибудь здесь помочь, пока я продолжу свои собственные исследования.

Я уточню этот пост с более подробной информацией, если потребуется, когда я получу ответы или найду дополнительную информацию.1043 *

Ответы [ 3 ]

0 голосов
/ 15 марта 2011

Как насчет использования location.href в сочетании с кодом из этого Использование Google Analytics с jQuery Mobile blog запись:

<script type="text/javascript">
    var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
    document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>


<script type="text/javascript">
    $('[data-role=page]').live('pageshow', function (event, ui) {
        try {
            var pageTracker = _gat._getTracker("YOUR_GA_ID");
            pageTracker._trackPageview(location.href.replace('#', ''));
        } catch(err) {

        }
    });
</script>
0 голосов
/ 21 марта 2011

Это код, который я использую. (Очень похоже на Николая)

Если он находит хеш (#) в windows.location, он анализирует путь после хеша. Пример: http://www.mysite.com/about/#/contact, url = '/ contact'

Если хеш отсутствует, например, при первой загрузке страницы, вместо него используется windows.location.pathname Пример: http://www.mysite.com/about, url = '/ about'

<script type="text/javascript">
$('[data-role=page]').live('pageshow', function(event, ui) {
    var url = window.location.toString();
    var hashLocation = url.indexOf("#");
    if (hashLocation != -1) {
        url = url.substring(hashLocation + 1);
    }
    else {
        url = window.location.pathname.toString();
    }

    try {
        var pageTracker = _gat._getTracker("UA-XXXXXXX-XX");    
        pageTracker._trackPageview(url);
    } catch (err) { }
});           
</script> 
0 голосов
/ 15 марта 2011

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

...