2013-11-26 10 views
21

Wie asp.net Steuerung für den Zugriff auf jquery mitZugriff auf Asp.net steuert mit Jquery (alle Optionen)

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

$('#myTextBox') nicht funktionieren würde.

+0

gezeigt Ich habe viele ähnliche Fragen bei der Überprüfung von Fragen in den letzten Tagen gesehen. Es gibt genügend Informationen darüber, aber ich habe beschlossen, hier eine umfassende Liste von Dingen zu schreiben. Hoffe das hilft. – Krishna

Antwort

64

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

Der obige aspx-Code, wenn sie

auf einer Seite Änderungen gemacht <input type="text" id="ctl00_Main_myTextBox" name="ctl00$Main$myTextBox" />

Dies ist, weil der Master und Steuerinformationen in dem die .net-Steuerelement befindet vorangestellt wird was es für uns etwas schwierig macht, einen Selektor zu schreiben.

Sie haben ein paar Optionen. Dies ist keineswegs umfassend, aber ich werde es versuchen.

Option1:

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

Verwenden Sie die ClientID - empfohlen, aber meh .. nicht so sehr. Ich würde versuchen, ClientID zu schreiben, wenn ich könnte. Der Hauptgrund dafür ist, dass Sie es nur in .aspx Seiten und nicht externen .js Dateien verwenden können.

Option2:

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

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

attribute selectors Verwendung - auch empfohlen, sieht ein bisschen hässlich, aber effektiv.

Ich habe hier ein paar Fragen, die sich um die Leistung mit diesen Selektoren kümmern. Ist das der beste Weg?

Aber die meiste Zeit werden Sie den Performance-Hit nicht bemerken, es sei denn, Ihr DOM-Baum ist riesig.

Option3:

CssClass Verwendung - sehr zu empfehlen. Weil Selektoren, die Klassen verwenden, sauber und unkompliziert sind.

Falls Sie sich fragen, CssClass für .net-Steuerelemente ist das gleiche wie class für traditionelle HTML-Steuerelemente.

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

$('.myclass') //selector 

Option4:

Verwenden ClientIDMode="Static", die in .NET Framework 4.0, über die Kontrolle eingeführt wurde, so dass es IDs unverändert bleiben wird. - auch empfohlen.

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

$('#myTextBox') //use the normal ID selector 

Hinweis: In meiner Erfahrung habe ich wie $('#ctl00_Main_myTextBox') hässlich Wähler gesehen. Dies ist das Ergebnis des direkten Kopierens der ID, die von der Seite gerendert wurde, und sie im Skript zu verwenden. Schau, das wird funktionieren. Aber denken Sie darüber nach, was passiert, wenn sich die Kontroll-ID oder die Master-ID ändert. Offensichtlich müssen Sie diese IDs erneut aufrufen und sie erneut ändern. Verwenden Sie stattdessen eine der oben genannten Optionen und werden Sie abgedeckt.

+0

Schnell unschuldige Frage: was passiert mit Option 4, wenn Sie dies in einem Steuerelement innerhalb eines Benutzersteuerelements tun, und Sie fügen dieses Benutzersteuerelement zweimal auf einer Seite hinzu. Gibt es irgendeine Art von Validierung zur Laufzeit oder führt dies einfach zu einer Duplizierung der ID im resultierenden HTML? –

+1

@Bartdude - es wird eine Duplizierung im resultierenden HTML verursachen. 'ClientIDMode' behält nur die vorhandene ID bei, so dass Sie vorsichtig sein müssen, wenn Sie unterscheiden, welche ID angeklickt wird. Die Verwendung von Klassen und/oder Datenattributselektoren wäre in diesem Fall wahrscheinlich eine gute Option. – Krishna

+1

Danke! Genau das, was ich dachte. Ich denke, Sie können nicht alles haben: Sicherheit und Flexibilität. –

0

Neben der Antwort von krishna Sie Namensattribut stattdessen verwenden können, wenn es in HTML von IIS gerendert wird der Name Attributwert zugewiesen sollte der gleiche wie der ID-Wert:

Beispiel

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

var invDate = $("input[name=txtSalesInvoiceDate]"); 
0

Zusätzlich zur Antwort von @krishna können Sie die Generierung der Websteuerungs-Client-ID sowohl auf Seitenebene als auch auf Websiteebene mithilfe von ClientIDMode="Static" In ASP.NET 4.0 steuern.

auf Seitenebene, wie unten dargestellt:

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

Auf Web-Site-Ebene

können Sie die web.config-Einstellungen verwenden, wie unten

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

    ... 
</system.web>