Можно ли интерполировать мою угловую скобку, проценты, равно <% =%> синтаксису во внешних файлах JavaScript? - PullRequest
4 голосов
/ 02 октября 2008

Часто при смешивании jQuery с asp.net мне нужно использовать процент угловой скобки asp .net, <%%>, синтаксис в селекторе jQuery.

Если я хотел бы отделить JavaScript от разметки на разные файлы, есть ли еще способ оценить мой файл JavaScript, чтобы проценты угловых скобок интерполировались до достижения клиентского браузера?

Ответы [ 4 ]

10 голосов
/ 02 октября 2008

Если вы хотите оценить <% code blocks %> как код ASP.NET в файле JavaScript, вы можете просто поместить JavaScript в файл ASPX и ссылаться на него из элемента SCRIPT.

script.js.aspx:

function hideElements()
 { <% foreach(var elementId in Request.QueryString["hide"].Split(',') { %>
   jQuery('#' + <%= elementId %>).hide('slow');
   <% } %>
 }

page.aspx

<script src="script.js.aspx?hide=<%= GetElementsIds() %>"
        type='text/javascript'></script>

page.aspx.cs:

public string GetElementIds() 
 {
   return string.Join(",", new []{control1.ClientID, control2.ClientID});
 }
2 голосов
/ 02 октября 2008

Нет, вам нужно будет изменить код JavaScript, чтобы принять эту информацию в качестве параметров.

Итак, вместо

jQuery('#<%=MainPanel.ClientId%>').hide('slow');

сделать что-то вроде этого:

function hidePanel(panelId) {
        jQuery('#' + panelId).hide('slow');
}

, который вы можете позвонить со своей страницы с помощью

hidePanel('<%=MainPanel.ClientId%>');
1 голос
/ 03 октября 2008

Я попытался отделить JavaScript в пользовательском элементе управления поисковой сетки от HTML в файле .ascx. В первой итерации я использовал функцию jQuery (document) .onReady, чтобы присоединить мою инициализацию.

Проблема в том, что теги <% =%>, используемые в селекторах jQuery, не были интерполированы правильно, а элементы управления, на которых действовал javascript, не были найдены в селекторах jQuery.

Затем я попытался создать объект json при инициализации страницы и записать его, используя метод asp.net Page.ClientScript.RegisterClientScriptBlock. Это работало нормально, но с недостатками: жестко связал имя объекта json и ключи в файле asp.net и файле javascript. Это невыгодно, поскольку в настоящее время существует «две точки правды», которые необходимо поддерживать, и, кроме того, существует вероятность конфликта имен на последней отрисованной странице.

Самым элегантным решением в рамках asp .net и использованием jQuery является создание поведения сценария ajax в javascript. Затем в коде asp зарегистрируйте свойства поведения сценария в методе GetScriptDescriptors () интерфейса IScriptControl, добавив идентификатор ClientID серверного элемента управления в качестве свойства в дескриптор сценария.

// Ajax Javacsript Code below:

Type.registerNamespace('SearchGrid');

// Define the behavior properties
//
ButtonBehavior = function() {
    ButtonBehavior.initializeBase(this);
    this._lnkSearchID = null;
}

// Create the prototype for the behavior
//
//
SearchGrid.ButtonBehavior.prototype = {
initialize: function() {
    SearchGrid.ButtonBehavior.callBaseMethod(this, 'initialize');
    jQuery('#' + this._lnkSearchID).click(function() { alert('We clicked!'); });
},

dispose: function() {
    SearchGrid.ButtonBehavior.callBaseMethod(this, 'dispose');
    jQuery('#' + this._lnkSearchID).unbind();
    }
}

// Register the class as a type that inherits from Sys.Component.
SearchGrid.ButtonBehavior.registerClass('SearchGrid.ButtonBehavior', Sys.Component);


if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();

Код Asp .Net ниже:

    public partial class SearchGrid : System.Web.UI.UserControl, IScriptControl
    {        
        // Initialization    
        protected override void OnPreRender(EventArgs e)
        {
            if (!this.DesignMode)
            {
                // Test for ScriptManager and register if it exists
                ScriptManager sm = ScriptManager.GetCurrent(Page);    
                if (sm == null)
                    throw new ApplicationException("A ScriptManager control must exist on the current page.");    
                sm.RegisterScriptControl(this);
            }    
            base.OnPreRender(e);
        }
        protected override void Render(HtmlTextWriter writer)
        {
            if (!this.DesignMode)
                sm.RegisterScriptDescriptors(this);

            base.Render(writer);
        }

        // IScriptControl Members
        public IEnumerable<ScriptDescriptor> GetScriptDescriptors()
        {
            ScriptBehaviorDescriptor desc = new ScriptBehaviorDescriptor("SearchGrid.ButtonBehavior", this.ClientID);         
            desc.AddProperty("lnkSearchID", this.lnkSearch.ClientID);
            yield return desc;
        }

        public IEnumerable<ScriptReference> GetScriptReferences()
        {
            ScriptReference reference = new ScriptReference();
            reference.Path = ResolveClientUrl("SearchGrid.ButtonBehavior.js");
            return new ScriptReference[] { reference };
        }       
    }

Преимущество здесь в том, что вы можете создавать автономные повторно используемые элементы управления с поведением javascript, содержащимися в его отдельном файле (или как веб-ресурс), при передаче состояния и контекста, которые в противном случае могли бы быть интерполированы с углом, процентами, равно синтаксису , необходимые для jQuery, чтобы сделать свою работу.

1 голос
/ 02 октября 2008

Вы также можете обрабатывать файлы .js как файлы .aspx; Таким образом, вы не потеряете intellisense и форматирование кода во время редактирования. Просто добавьте это в web.config:

<system.webServer>
    <handlers>
       <add name="Dynamic JS" path="*.js" verb="*" type="System.Web.UI.PageHandlerFactory" resourceType="Unspecified"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...