代码之家  ›  专栏  ›  技术社区  ›  Anthony Atmaram

一页上有多个ASP.NET控件

  •  0
  • Anthony Atmaram  · 技术社区  · 15 年前

    我们已经为ASP.NET创建了一个用户控件。在任何时候,用户的配置文件页都可以包含这些控件的一个到无穷大。ascx文件包含相当多的javascript。当.NET将控件呈现为HTML时,您会注意到它为每个控件打印了JavaScript。

    这是意料之中的。我想减少服务器的HTML输出量以增加页面加载时间。通常,您可以将javascript移动到一个外部文件,然后只需要一个额外的HTTP请求,它将为所有控件提供服务。

    但是在javascript中我们有类似

    document.getElementById('<%= txtTextBox.ClientID %>');
    javascript如何知道哪个用户控件可以使用?有没有人做过这样的事情,或者解决方案正盯着我看?
    4 回复  |  直到 14 年前
        1
  •  2
  •   Aren    15 年前

    编写获取ID的函数,将它们放到mysite.js中,并像这样引用文件:

    <script type="text/javascript" src="/mysite.js"></script>
    

    然后,当您在控件中拨打电话时,按如下方式进行操作:

    <div onClick="DoMyFunctionThatIWant('<%= txtTextBox.ClientID %>')">...</div>
    

    那么您在JS中的函数是这样的:

    function DoMyFunctionThatIWant(domId)
    {
       var obj = document.getElementById(domId);
    }
    
        2
  •  0
  •   jkody21    15 年前

    您是否能够使用jquery?对于这些类型的场景,CSS选择器功能非常强大。例如:

    <div class="action" id="1">Node 1</div>
    <div class="action" id="2">Node 2</div>
    <div class="action" id="3">Node 3</div>
    <div class="action" id="4">Node 4</div>
    <div class="action" id="5">Node 5</div>
    

    然后,您将拥有一个javascript函数,并将其绑定到满足选择器条件的每个元素上。它可能看起来像:

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script type="text/javascript">
        $('.action').click(function() {
            var $t = $(this);       //---here is your contextual node
            alert($t.attr('id'));   //---this alerts the id value of your node
        });
    </script>
    
        3
  •  0
  •   Anthony Atmaram    15 年前

    解决方法如下:

    • 创建外部javascript文件并将所有代码复制到该文件中。
    • 对于需要由javascript引用的用户控件中的每个元素,创建一个新对象。
    • 回到usercontrol的ascx文件中,获取每个usercontrol的id并使其成为对象的成员,并使该成员的值等于该对象引用的usercontrol中元素的id。执行这个任务。
    • 现在,在每个函数中,通过使用控件的ID作为键从对象中获取这个ID,找到您想要的实际元素。

    我实际的完全解决方案有点不同。每个用户控件都包含一个telerik radgrid。radgrid的客户端事件处理程序的格式为

    radGrid_eventOccurred(sender, args) {
    其中sender是网格对象。

    因此,我没有使用用户控件ID作为代码中的键,而是使用网格。

    假设每当我单击网格中的一行时,都需要更新用户控件内的文本框。我现在可以这样做了:

    function radGrid_rowClick(sender, args) {
        var text = /*Get the text of the clicked row*/;
    
        var textBox = textBoxesObject[sender];
        textBox.set_value(text);
    }
    
        4
  •  0
  •   Martin Kirsch    14 年前

    编写Microsoft Ajax客户端组件。

    这需要做很多事情:

    • 在javascript文件中编写组件类。
    • 通过在代码隐藏类上实现IScriptControl来注册此脚本文件。
    • 通过实现代码隐藏类的getscriptDescriptors来创建客户端组件的实例。
    • 将clientID作为参数输入描述符,这样客户机组件类(用JS编写)就知道客户机ID。

    组件类可以做所有您想要做的事情,因为它知道您的用户控件的所有客户端ID。无论如何,这对同一用户控件的多个实例都有效。作为一个陷阱,这有点难以实现。但是很干净。