是否可以插入我的尖括号,百分比,等于<%=%>外部javascript文件中的语法?

时间:2008-10-01 21:28:00

标签: .net javascript jquery

通常在将jQuery与asp.net混合时,我需要在jQuery选择器中使用asp .net尖括号百分比,< %%>,语法。

如果我想将JavaScript与标记分成不同的文件,还有办法评估我的JavaScript文件,以便在到达客户端浏览器之前插入尖括号百分比吗?

4 个答案:

答案 0 :(得分:10)

如果要将<% code blocks %>评估为JavaScript文件中的ASP.NET代码,可以将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});
 }

答案 1 :(得分:2)

不,您需要重构JavaScript以接受该信息作为参数。

所以,而不是

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

做这样的事情:

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

您可以通过

从您的页面调用
hidePanel('<%=MainPanel.ClientId%>');

答案 2 :(得分:1)

您还可以将.js文件作为.aspx文件处理;这样,在编辑它们时,您不会丢失智能感知和代码格式。只需将其添加到web.config:

<system.webServer>
    <handlers>
       <add name="Dynamic JS" path="*.js" verb="*" type="System.Web.UI.PageHandlerFactory" resourceType="Unspecified"/>

答案 3 :(得分:1)

我尝试将搜索网格用户控件上的javascript与.ascx文件中的html分开。在第一次迭代中,我使用了jQuery(document).onReady函数来附加我的初始化。

问题在于&lt;%=%&gt; jQuery选择器中使用的标签没有正确插入,并且jQuery选择器找不到javascript作用的控件。

接下来,我尝试在Page初始化中创建一个json对象,并使用asp.net方法Page.ClientScript.RegisterClientScriptBlock将其写出来。这工作正常,但有缺点:在asp.net文件和javascript文件中硬连接json对象的名称和键。这是不利的,因为现在存在“两个真实点”需要维护,并且在最终渲染页面中可能存在名称冲突的可能性。

asp .net中最优雅的解决方案是利用jQuery在javascript中创建一个ajax脚本行为。然后在asp codebehind中注册IScriptControl接口的GetScriptDescriptors()方法中的脚本行为属性,将服务器端控件的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行为包含在其自己的单独文件中(或作为Web资源),同时传递状态和上下文,否则可能会使用angle,percent,equals语法进行插值,jQuery完成其工作所必需的。