【问题标题】:Accessing Asp.net controls using jquery (all options)使用 jquery 访问 Asp.net 控件(所有选项)
【发布时间】:2013-12-12 04:36:15
【问题描述】:

如何使用jquery访问asp.net控件

<asp:TextBox runat="server" ID="myTextBox" />

$('#myTextBox') 不起作用。

【问题讨论】:

  • 这几天在复习问题的时候看到了很多类似的问题。有足够的信息,但我决定在这里写一个全面的清单。希望这会有所帮助。

标签: javascript c# jquery asp.net


【解决方案1】:

除了@krishna 的回答之外,您还可以在 ASP.NET 4.0 中使用ClientIDMode="Static" 在页面级别和网站级别控制 Web 控件客户端 ID 生成。

在页面级别,如下图:

<%@ Page Title="" Language="C#" MasterPageFile="~/Members/Site.Master" AutoEventWireup="true" CodeBehind="Calculator.aspx.cs" 
Inherits="store.Members.Calculator" 
ClientIDMode="Static"
%>

在网站级别

您可以使用如下所示的 web.config 设置

 <system.web>
    <pages ClientIDMode="Static">
    </pages>

   ...
 </system.web>

【讨论】:

    【解决方案2】:

    除了krishna 的回答之外,您还可以使用 name 属性,当它由 IIS 以 HTML 呈现时,分配的 name 属性值应与 ID 值相同:

    示例

    <asp:TextBox ID="txtSalesInvoiceDate" runat="server" />
    
    var invDate = $("input[name=txtSalesInvoiceDate]");
    

    【讨论】:

      【解决方案3】:

      &lt;asp:TextBox runat="server" ID="myTextBox" /&gt;

      上面的aspx代码在页面上渲染时变为

      &lt;input type="text" id="ctl00_Main_myTextBox" name="ctl00$Main$myTextBox" /&gt;

      这是因为 .net 控件所在的主控和控制信息被预先添加,这使得我们编写选择器有点棘手。

      您有几个选择。这绝不是全面的,但我会尝试一下。

      选项1:

      $('#<%= myTextBox.ClientID %>')
      

      使用ClientID - 推荐,但嗯.. 没那么多。如果可以的话,我会尽量避免写ClientID。主要原因是,您只能在.aspx 页面中使用它,而不能在外部.js 文件中使用它。

      选项2:

      $('[id$=myTextBox]') // id which ends with the text 'myTextBox'
      
      $('[id*=myTextBox]') // id which contains the text 'myTextBox'
      

      使用attribute selectors - 也推荐,看起来有点丑但是很有效。

      我在这里看到了一些问题,担心这些选择器的性能。 这是最好的方法吗?不。

      但是,大多数时候您甚至不会注意到性能下降,当然,除非您的 DOM 树很大。

      选项3:

      使用CssClass - 强烈推荐。因为使用类的选择器是干净且简单的。

      如果您想知道,.net 控件的 CssClass 与传统 html 控件的 class 相同。

      <asp:TextBox runat="server" ID="myTextBox" CssClass="myclass" /> //add CssClass
      
      $('.myclass') //selector
      

      选项 4:

      在控件上使用在 .NET Framework 4.0 中引入的ClientIDMode="Static",使其 ID 保持不变。 - 也推荐。

      <asp:TextBox runat="server" ID="myTextBox" ClientIDMode="Static"  /> //add ClientIDMode
      
      $('#myTextBox') //use the normal ID selector
      

      注意: 根据我的经验,我见过像$('#ctl00_Main_myTextBox') 这样的丑陋选择器。这是直接复制粘贴从页面呈现的 ID 并在脚本中使用的结果。看,这会奏效。但是想想如果控制 ID 或主 ID 发生变化会发生什么。显然,您将不得不重新访问这些 ID 并再次更改它们。取而代之的是,使用上述选项之一并被覆盖。

      【讨论】:

      • 快速无辜的问题:如果您在用户控件中的控件中执行此操作,并且在页面上添加此用户控件两次,选项 4 会发生什么情况。运行时是否有某种验证,或者它只会导致生成的 HTML 中的 id 重复?
      • @Bartdude - 它会导致生成的 HTML 重复。 ClientIDMode 只保留现有 ID,因此在区分单击哪个 ID 时必须小心。在这种情况下,使用类和/或数据属性选择器可能是一个不错的选择。
      • 谢谢!正是我的想法。我猜你不可能拥有这一切:安全性和灵活性。
      • 为了按照 JQuery 文档在语法上正确,实际的 ID 应该用引号引起来。 $("[id$='myTextBox']") $("[id*='myTextBox']")
      猜你喜欢
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多