【问题标题】:Get clientid in user control from external javascript file从外部 javascript 文件中获取用户控件中的 clientid
【发布时间】:2011-01-30 19:06:53
【问题描述】:

我正在 ASP.NET 中开发一个用户控件 (ascx),它使用 javascript 来操作控件。目前,javascript 代码是内联的,并使用<%= somecontrol.ClientID %> 来获取它需要的控件。

我想将 javascript 文件放在外部文件中,但是从外部文件中我无法使用上述语法来检索控件。我在thisthis 的答案中阅读了可能的解决方案,但问题是用户控件可以在页面上多次放置。这意味着 Controls 数组(在答案中提到)将使用不同的项目多次呈现。结果,脚本将无法检索它需要的 id。如果我将<%= ClientId %> 放在包含项目的数组的名称中,那么我将遇到与我试图解决的问题相同的问题。

有什么想法吗?

【问题讨论】:

标签: c# asp.net javascript jquery user-controls


【解决方案1】:

好的,另一种方法,我尝试使用 JavaScript 类样式,然后为每个控件初始化它。

在外部 javascript 文件中,将代码编写为:

function oNameCls(ControlId1) {

    this.ControlId1 = ControlId1;

    this.DoYourWork1 = function() {
        // use the control id.
        // this.ControlId1
    }    
    this.DoYourWork2 = function() {
        // use the control id.
        // this.ControlId1
    }    

}

然后在控件上进行这样的调用。

<script language="Javascript" type="text/javascript">
    // init - create
    var <%=this.ClientID%>MyCls = new oNameCls(<%=Control1.ClientID%>);
    // do your work
    <%=this.ClientID%>MyCls.DoYourWork1();
</script>

希望现在能提供更好的帮助。

【讨论】:

  • 这对我不起作用。我考虑过这一点,但我正在设计用户控件而不是页面。
  • 好吧,对不起,我的英语不是很好,我想念那个 - 我会更新我的想法......或者现在删除并重新考虑。
【解决方案2】:

如果您想在可能有多个副本的情况下找到一个特定控件,则无法做到这一点。外部 javascript 如何知道您想要哪个 n 控件?

如何将行为绑定到一个类并找到相对于动作控件位置的元素,如下所示:

用户控制:

<div class="myControl">
  <asp:Button id="MyButton" runat="server" Text="Click Me" />
  <div style="display:none;">Show me!</div>
</div>

如果你的 jQuery 是这样写的:

$(".myControl input").click(function() {
  $(this).next().slideDown();
});

在这种情况下,具体的 ID 是什么并不重要,只要您可以相对于您需要的控件导航 DOM。即使它像.closest("div").next().find(".bob").prev() 这样更复杂......无论你需要什么都可以。

【讨论】:

  • javascript 文件包含在用户控件本身中,而不是页面中。
  • @Giorgi - 无论它来自哪里,它都会出现在页面上,请确保您正在注册它,而不是每次都将它包含在用户控件中。
  • 每个用户控件和其中的控件都有不同的clientid。我想要实现的是 javascript 代码只处理包含它的控件。
【解决方案3】:

我解决此问题的方法是使用 CSS 类或将控件放置在具有已知 ID 的容器中,然后遍历容器的子项以获取实际控件。例如:

<asp:TextBox ID="Something" runat="server" CssClass="mycontrol" ... />

可以通过以下方式访问:

jQuery('.mycontrol');

或者:

<div id="ControlContainer">
    <asp:TextBox ID="Something" runat="server" ... />
</div>

可以通过以下方式访问:

jQuery("#ControlContainer input[type='text']");

这种方法唯一真正的问题是您将代码绑定到页面上的特定标记,如果标记发生很大变化,这可能会很麻烦。

【讨论】:

  • 我认为使用另一种方法来识别有问题的控件,如 CSS 类,是要走的路。
  • 我认为这不是一个好的解决方案,因为如果我将多个控件放在同一页面上,它们将具有相同的类。与 id 相比,按类选择控件也更慢。
  • 您可以在用户控件中呈现“ControlContainer”父元素,并使其 ID 成为您指定的某个属性,作为传递给用户控件的属性。这样,页面上的每个实例都是唯一的。然后控件中的 javascript 调用可以将该容器 ID 传递给在外部 JS 文件中定义的函数,它可以用来选择该实例容器中的特定控件。你是对的,按类选择比按 ID 选择慢,但差异可能以每次操作的毫秒数来衡量。
【解决方案4】:

隐藏变量呢:

<input type="hidden" id="ClientId" value="<%=ClientId %>">

然后从你的 js 中:

$("#" + $("#ClientID").val())

或者,将哈希放入:

<input type="hidden" id="ClientId" value="#<%=ClientId %>">

...

$($("#ClientID").val())

【讨论】:

  • 如果我在页面上多次放置控件,那么隐藏变量也会有几个。
猜你喜欢
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 2017-06-24
  • 2011-11-21
  • 2011-02-07
相关资源
最近更新 更多