是否可以在外部javascript文件中插入尖括号%等于<%=%>语法?
通常,当将jQuery与asp.net混合使用时,我需要在jQuery选择器中使用asp .net尖括号百分比<%%>语法。
如果我想将JavaScript与标记分开到不同的文件中,是否仍然可以评估我的JavaScript文件,以便在到达客户端浏览器之前对尖括号百分数进行插值?
解决方案
不,我们需要重构JavaScript才能接受该信息作为参数。
所以,代替
jQuery('#<%=MainPanel.ClientId%>').hide('slow');
做这样的事情:
function hidePanel(panelId) { jQuery('#' + panelId).hide('slow'); }
我们可以从页面调用
hidePanel('<%=MainPanel.ClientId%>');
如果要在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}); }
我们也可以将.js文件处理为.aspx文件;这样,我们在编辑它们时就不会失去智能和代码格式。只需将其添加到web.config中:
<system.webServer> <handlers> <add name="Dynamic JS" path="*.js" verb="*" type="System.Web.UI.PageHandlerFactory" resourceType="Unspecified"/>
我试图将搜索网格用户控件上的javascript与.ascx文件中的html分开。在第一个迭代中,我使用了jQuery(document).onReady函数来添加我的初始化。
这样做的问题是,在jQuery选择器中使用的<%=%>标签未正确插入,并且在jQuery选择器中未找到执行JavaScript的控件。
接下来,我尝试在Page初始化中创建一个json对象,并使用asp.net方法Page.ClientScript.RegisterClientScriptBlock将其写出。这行得通,但有缺点:硬接线asp.net文件和javascript文件中的json对象的名称和键。这是不利的,因为现在存在"两个真相"要维护,而且在最终呈现的页面中还存在名称冲突的可能性。
在asp .net中并使用jQuery的最优雅的解决方案是在javascript中创建ajax脚本行为。然后,在后面的asp代码中,在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行为来创建独立的可重用控件,否则它们可能会被插入为jQuery完成其工作。