.net 是否可以插入我的角括号,百分比,等于<;%=%&燃气轮机;外部javascript文件中的语法?

.net 是否可以插入我的角括号,百分比,等于<;%=%&燃气轮机;外部javascript文件中的语法?,.net,javascript,jquery,.net,Javascript,Jquery,通常,在将jQuery与asp.net混合使用时,我需要在jQuery选择器中使用asp.net角括号百分比语法 如果我想将JavaScript与标记分离到不同的文件中,是否还有方法评估我的JavaScript文件,以便在到达客户端浏览器之前插入尖括号百分比?否,您需要重构JavaScript以接受该信息作为参数 因此,与其 jQuery('#<%=MainPanel.ClientId%>').hide('slow'); 您可以在页面上使用 hidePanel('<%=Mai

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


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

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

因此,与其

jQuery('#<%=MainPanel.ClientId%>').hide('slow');
您可以在页面上使用

hidePanel('<%=MainPanel.ClientId%>');
hidePanel(“”);

如果要将
作为JavaScript文件中的ASP.NET代码进行评估,只需将JavaScript放入ASPX文件并从脚本元素引用即可

script.js.aspx

function hideElements()
 { <% foreach(var elementId in Request.QueryString["hide"].Split(',') { %>
   jQuery('#' + <%= elementId %>).hide('slow');
   <% } %>
 }
<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文件处理;这样,您在编辑它们时不会丢失intellisense和代码格式。只需将此添加到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所作用的控件

接下来,我尝试在页面初始化中创建一个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 };
        }       
    }
public部分类SearchGrid:System.Web.UI.UserControl,IScriptControl
{        
//初始化
受保护的覆盖无效OnPreRender(EventArgs e)
{
如果(!this.DesignMode)
{
//测试ScriptManager并注册它(如果存在)
ScriptManager sm=ScriptManager.GetCurrent(第页);
if(sm==null)
抛出新的ApplicationException(“当前页面上必须存在ScriptManager控件。”);
sm.RegisterScriptControl(此);
}    
基于预渲染(e);
}
受保护的覆盖无效渲染(HtmlTextWriter编写器)
{
如果(!this.DesignMode)
sm.RegisterScript描述符(本);
base.Render(writer);
}
//IScriptControl成员
公共IEnumerable GetScriptDescriptors()
{
ScriptBehaviorDescriptor desc=新的ScriptBehaviorDescriptor(“SearchGrid.ButtonBehavior”,this.ClientID);
desc.AddProperty(“lnkSearchID”,this.lnkSearch.ClientID);
收益率下降;
}
公共IEnumerable GetScriptReferences()
{
ScriptReference=新建ScriptReference();
reference.Path=ResolveClientUrl(“SearchGrid.ButtonBehavior.js”);
返回新的ScriptReference[]{reference};
}       
}


这里的优点是,在传递状态和上下文时,您可以使用包含在其单独文件(或作为web资源)中的javascript行为创建独立的可重用控件,否则可能会插入角度、百分比、等于语法,这是jQuery执行其工作所必需的

这仍然需要混合javascript和标记。这是我试图避免的。我使用jQuery的$(document).onReady事件来连接其余的处理程序,从而消除了混合标记和脚本的需要。您得到了一个很好的小提示!您可能想改用.ashx,它比.aspxOh轻,而且我还将内容类型设置为plain/text。ashx不解析plain/text,以及为什么使用plain/text(应该是text/plain)?使用text/javascript。请注意,允许客户端提供的内容直接注入到javascript中不是一个好主意。您应该确保该值经过验证。问题是,当您需要的只是某个静态文件时,所有.js文件都会创建一个页面对象。Marxidad不是已经连接到PageHandlerFactory的.aspx文件,也会创建一个页面对象吗?是的,但是如果您只对需要它的javascript文件使用它,那么它就没有那么糟糕了对每个.js文件都这样做。
    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 };
        }       
    }