İçerik Sayfalarında Denetim Kimliği Adlandırma (VB)Control ID Naming in Content Pages (VB)

Scott Mitchell tarafındanby Scott Mitchell

Kodu indirin veya PDF 'yi indirinDownload Code or Download PDF

ContentPlaceHolder denetimlerinin adlandırma kapsayıcısı olarak nasıl çalıştığını gösterir ve bu nedenle programlı olarak bir denetim ile çalışır (FindControl aracılığıyla).Illustrates how ContentPlaceHolder controls serve as a naming container and therefore make programmatically working with a control difficult (via FindControl). Bu soruna ve geçici çözümlere bakar.Looks at this issue and workarounds. Ayrıca, elde edilen ClientID değerine programlı olarak nasıl erişebileceğinizi açıklar.Also discusses how to programmatically access the resulting ClientID value.

GirişIntroduction

Tüm ASP.NET Server denetimleri, denetimi benzersiz bir şekilde tanımlayan bir ID özelliği içerir ve denetimin arka plan kod sınıfında programlı olarak eriştiği anlamına gelir.All ASP.NET server controls include an ID property that uniquely identifies the control and is the means by which the control is programmatically accessed in the code-behind class. Benzer şekilde, bir HTML belgesindeki öğeler, öğeyi benzersiz bir şekilde tanımlayan bir id özniteliği içerebilir; Bu id değerler genellikle belirli bir HTML öğesine programlı olarak başvurmak için istemci tarafı betikte kullanılır.Similarly, the elements in an HTML document may include an id attribute that uniquely identifies the element; these id values are often used in client-side script to programmatically reference a particular HTML element. Bu şekilde, bir ASP.NET sunucu denetimi HTML 'de işlendiğinde, ID değerinin işlenmiş HTML öğesinin id değeri olarak kullanıldığını varsayabilirsiniz.Given this, you may assume that when an ASP.NET server control is rendered into HTML, its ID value is used as the id value of the rendered HTML element. Bu durum, belirli koşullarda tek bir ID değeri olan tek bir denetimin, işlenmiş biçimlendirmede birden çok kez görünebileceğinden, bu durum değildir.This is not necessarily the case because in certain circumstances a single control with a single ID value may appear multiple times in the rendered markup. ProductName``ID bir değeri olan bir etiket Web denetimiyle TemplateField içeren bir GridView denetimi düşünün.Consider a GridView control that includes a TemplateField with a Label Web control with an ID value of ProductName. GridView, çalışma zamanında veri kaynağına bağlandığında, bu etiket her GridView satırı için yinelenir.When the GridView is bound to its data source at runtime, this Label is repeated once for every GridView row. İşlenen her etiketin benzersiz bir id değeri olması gerekir.Each rendered Label needs a unique id value.

Bu tür senaryoları işlemek için, ASP.NET, belirli denetimlerin adlandırma kapsayıcıları olarak kullanılmasına izin verir.To handle such scenarios, ASP.NET allows certain controls to be denoted as naming containers. Adlandırma kapsayıcısı yeni bir ID ad alanı işlevi görür.A naming container serves as a new ID namespace. Adlandırma kapsayıcısı içinde görünen tüm sunucu denetimleri, adlandırma kapsayıcısı denetiminin ID önekli id değerine sahiptir.Any server controls that appear within the naming container have their rendered id value prefixed with the ID of the naming container control. Örneğin, GridView ve GridViewRow sınıfları, her iki adlandırma kapsayıcılarıdır.For example, the GridView and GridViewRow classes are both naming containers. Sonuç olarak, ID ProductName olan bir GridView TemplateField 'da tanımlanan bir etiket denetimine GridViewID_GridViewRowID_ProductNameişlenmiş id değeri verilir.Consequently, a Label control defined in a GridView TemplateField with ID ProductName is given a rendered id value of GridViewID_GridViewRowID_ProductName. Gridviewrowıd her GridView satırı için benzersiz olduğundan, sonuçta elde edilen id değerleri benzersizdir.Because GridViewRowID is unique for each GridView row, the resulting id values are unique.

Note

INamingContainer arabirimi , belirli bir ASP.NET Server denetiminin bir adlandırma kapsayıcısı olarak çalışması gerektiğini belirtmek için kullanılır.The INamingContainer interface is used to indicate that a particular ASP.NET server control should function as a naming container. INamingContainer arabirimi, sunucu denetiminin uygulaması gereken herhangi bir yöntemi değil; Bunun yerine işaret olarak kullanılır.The INamingContainer interface does not spell out any methods that the server control must implement; rather, it's used as a marker. İşlenmiş biçimlendirmeyi oluştururken, bir denetim bu arabirimi uygularsa, ASP.NET altyapısı ID değerini otomatik olarak alt öğelerinden ' işlenmiş id öznitelik değerlerine ekler.In generating the rendered markup, if a control implements this interface then the ASP.NET engine automatically prefixes its ID value to its descendents' rendered id attribute values. Bu işlem, adım 2 ' de daha ayrıntılı bir şekilde ele alınmıştır.This process is discussed in more detail in Step 2.

Adlandırma kapsayıcıları yalnızca işlenen id öznitelik değerini değiştirmez, ancak aynı zamanda denetimin ASP.NET sayfasının arka plan kod sınıfından programlama yoluyla nasıl başvurduğunu da etkiler.Naming containers not only change the rendered id attribute value, but also affect how the control may be programmatically referenced from the ASP.NET page's code-behind class. FindControl("controlID") yöntemi, yaygın olarak bir Web denetimine başvurmak için kullanılır.The FindControl("controlID") method is commonly used to programmatically reference a Web control. Ancak FindControl, adlandırma kapsayıcıları aracılığıyla sızmaz.However, FindControl does not penetrate through naming containers. Sonuç olarak, GridView veya diğer adlandırma kapsayıcısı içindeki denetimlere başvurmak için Page.FindControl yöntemini doğrudan kullanamazsınız.Consequently, you cannot directly use the Page.FindControl method to reference controls within a GridView or other naming container.

Yukarıda da belirtildiği gibi, ana sayfalar ve Contentyertutucuların her ikisi de adlandırma kapsayıcıları olarak uygulanır.As you may have surmised, master pages and ContentPlaceHolders are both implemented as naming containers. Bu öğreticide, ana sayfaların HTML öğesi id nasıl etkilediğini ve FindControlkullanarak bir içerik sayfasında program aracılığıyla Web denetimlerine nasıl başvurulacağını inceleyeceğiz.In this tutorial we examine how master pages affect HTML element id values and ways to programmatically reference Web controls within a content page using FindControl.

1. Adım: yeni bir ASP.NET sayfası eklemeStep 1: Adding a New ASP.NET Page

Bu öğreticide ele alınan kavramları göstermek için Web sitemize yeni bir ASP.NET sayfası ekleyelim.To demonstrate the concepts discussed in this tutorial, let's add a new ASP.NET page to our website. Kök klasörde IDIssues.aspx adlı yeni bir içerik sayfası oluşturun ve Site.master ana sayfasına bağlama.Create a new content page named IDIssues.aspx in the root folder, binding it to the Site.master master page.

Idissues. aspx Içerik sayfasını kök klasöre ekleyin

Şekil 01: içerik sayfası IDIssues.aspx kök klasöre ekleyinFigure 01: Add the Content Page IDIssues.aspx to the Root Folder

Visual Studio, ana sayfanın dört Contentiyertutucusu için otomatik olarak bir Içerik denetimi oluşturur.Visual Studio automatically creates a Content control for each of the master page's four ContentPlaceHolders. Birden çok Contenttutucuları ve varsayılan içerik öğreticisinde belirtildiği gibi, içerik denetimi yoksa, ana sayfanın varsayılan ContentPlaceHolder içeriği yayılır.As noted in the Multiple ContentPlaceHolders and Default Content tutorial, if a Content control is not present the master page's default ContentPlaceHolder content is emitted instead. QuickLoginUI ve LeftColumnContent Contentyertutucuları Bu sayfa için uygun varsayılan biçimlendirmeyi içerdiğinden, devam edin ve ilgili Içerik denetimlerini IDIssues.aspxkaldırın.Because the QuickLoginUI and LeftColumnContent ContentPlaceHolders contain suitable default markup for this page, go ahead and remove their corresponding Content controls from IDIssues.aspx. Bu noktada, içerik sayfasının bildirim temelli biçimlendirme aşağıdaki gibi görünmelidir:At this point, the content page's declarative markup should look like the following:

<%@ Page Language="VB" MasterPageFile="~/Site.master" AutoEventWireup="false" CodeFile="IDIssues.aspx.vb" Inherits="IDIssues" Title="Untitled Page" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server">
</asp:Content>

Ana sayfada başlık, meta etiketler ve DIĞER HTML üst bilgilerini belirtme öğreticisinde, açıkça ayarlanmamışsa sayfanın başlığını otomatik olarak yapılandıran özel bir temel sayfa sınıfı (BasePage) oluşturduk.In the Specifying the Title, Meta Tags, and Other HTML Headers in the Master Page tutorial we created a custom base page class (BasePage) that automatically configures the page's title if it is not explicitly set. IDIssues.aspx sayfasında bu işlevselliği kullanmak için, sayfanın arka plan kod sınıfı BasePage sınıfından türetmelidir (System.Web.UI.Pageyerine).For the IDIssues.aspx page to employ this functionality, the page's code-behind class must derive from the BasePage class (instead of System.Web.UI.Page). Arka plan kod sınıfının tanımını, aşağıdakine benzer şekilde değiştirin:Modify the code-behind class's definition so that it looks like the following:

Partial Class IDIssues
 Inherits BasePage

End Class

Son olarak, Web.sitemap dosyasını bu yeni ders için bir giriş içerecek şekilde güncelleştirin.Finally, update the Web.sitemap file to include an entry for this new lesson. <siteMapNode> bir öğesi ekleyin ve title ve url özniteliklerini sırasıyla "Denetim KIMLIĞI adlandırma sorunları" ve ~/IDIssues.aspxolarak ayarlayın.Add a <siteMapNode> element and set its title and url attributes to "Control ID Naming Issues" and ~/IDIssues.aspx, respectively. Bunu yaptıktan sonra Web.sitemap dosyanızın biçimlendirmesi aşağıdakine benzer görünmelidir:After making this addition your Web.sitemap file's markup should look similar to the following:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
 <siteMapNode url="~/Default.aspx" title="Home">
 <siteMapNode url="~/About.aspx" title="About the Author" />
 <siteMapNode url="~/MultipleContentPlaceHolders.aspx" title="Using Multiple ContentPlaceHolder Controls" />
 <siteMapNode url="~/Admin/Default.aspx" title="Rebasing URLs" />
 <siteMapNode url="~/IDIssues.aspx" title="Control ID Naming Issues" />
 </siteMapNode>
</siteMap>

Şekil 2 ' de gösterildiği gibi, Web.sitemap yeni site haritası girişi, sol sütundaki dersler bölümünde hemen yansıtılır.As Figure 2 illustrates, the new site map entry in Web.sitemap is immediately reflected in the Lessons section in the left column.

Dersler bölümü artık "denetim KIMLIĞI adlandırma sorunlarına bir bağlantı Içerir"

Şekil 02: dersler bölümü artık "denetim kimliği adlandırma sorunları" bağlantısını içerirFigure 02: The Lessons Section Now Includes a Link to "Control ID Naming Issues"

2. Adım: IşlenmişIDdeğişikliklerini IncelemeStep 2: Examining the RenderedIDChanges

ASP.NET altyapısının, sunucu denetimlerinin işlenmiş id değerlerinde yaptığı değişiklikleri daha iyi anlamak için, IDIssues.aspx sayfasına birkaç Web denetimi ekleyelim ve sonra tarayıcıya gönderilen işlenmiş biçimlendirmeyi görüntüleyelim.To better understand the modifications the ASP.NET engine makes to the rendered id values of server controls, let's add a few Web controls to the IDIssues.aspx page and then view the rendered markup sent to the browser. Özellikle, "Lütfen yaşını girin:" ve ardından bir metin kutusu Web denetimi yazın.Specifically, type in the text "Please enter your age:" followed by a TextBox Web control. Sayfada daha fazla bir düğme web denetimi ve bir etiket Web denetimi ekleyin.Further down on the page add a Button Web control and a Label Web control. TextBox 'ın ID ve Columns özelliklerini sırasıyla Age ve 3 olarak ayarlayın.Set the TextBox's ID and Columns properties to Age and 3, respectively. Düğmenin Text ve ID özelliklerini "Gönder" ve SubmitButtonolarak ayarlayın.Set the Button's Text and ID properties to "Submit" and SubmitButton. Etiketin Text özelliğini temizleyin ve ID Resultsolarak ayarlayın.Clear out the Label's Text property and set its ID to Results.

Bu noktada, Içerik denetiminizin bildirime dayalı biçimlendirmesi aşağıdakine benzer olmalıdır:At this point your Content control's declarative markup should look similar to the following:

<p>
 Please enter your age:
 <asp:TextBox ID="Age" Columns="3" runat="server"></asp:TextBox>
</p>
<p>
 <asp:Button ID="SubmitButton" runat="server" Text="Submit" />
</p>
<p>
 <asp:Label ID="Results" runat="server"></asp:Label>
</p>

Şekil 3 ' te, Visual Studio 'nun Tasarımcısı aracılığıyla görüntülendiğinde sayfa gösterilmektedir.Figure 3 shows the page when viewed through Visual Studio's designer.

Sayfa üç Web denetimi Içerir: TextBox, Button ve LabelThe Page Includes Three Web Controls: a TextBox, Button, and Label

Şekil 03: sayfa üç Web denetimi içerir: bir TextBox, düğme ve etiket (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 03: The Page Includes Three Web Controls: a TextBox, Button, and Label (Click to view full-size image)

Sayfayı bir tarayıcıda ziyaret edin ve HTML kaynağını görüntüleyin.Visit the page through a browser and then view the HTML source. Aşağıdaki biçimlendirme gösterildiği gibi, TextBox, Button ve Label Web denetimlerinin HTML öğelerinin id değerleri, Web denetimlerinin ID değerlerinin ve sayfadaki adlandırma kapsayıcılarının ID değerlerinin bir birleşimidir.As the markup below shows, the id values of the HTML elements for the TextBox, Button, and Label Web controls are a combination of the ID values of the Web controls and the ID values of the naming containers in the page.

<p>
 Please enter your age:
 <input name="ctl00$MainContent$Age" type="text" size="3" id="ctl00_MainContent_Age" />
</p>
<p>

 <input type="submit" name="ctl00$MainContent$SubmitButton" value="Submit" id="ctl00_MainContent_SubmitButton" />
</p>
<p>
 <span id="ctl00_MainContent_Results"></span>
</p>

Bu öğreticide daha önce belirtildiği gibi, hem ana sayfa hem de onun Içerik yer tutucuları adlandırma kapsayıcıları olarak görev yapar.As noted earlier in this tutorial, both the master page and its ContentPlaceHolders serve as naming containers. Sonuç olarak, her ikisi de iç içe denetimlerinin işlenmiş ID değerlerini katkıda bulunur.Consequently, both contribute the rendered ID values of their nested controls. TextBox 'ın id özniteliğini al, örneğin: ctl00_MainContent_Age.Take the TextBox's id attribute, for instance: ctl00_MainContent_Age. TextBox denetiminin ID değerinin Ageolduğunu hatırlayın.Recall that the TextBox control's ID value was Age. Bu, ContentPlaceHolder denetimin ID değeri MainContentön ekine sahiptir.This is prefixed with its ContentPlaceHolder control's ID value, MainContent. Ayrıca, bu değere ana sayfanın ID değeri ctl00ön eki eklenir.Furthermore, this value is prefixed with the master page's ID value, ctl00. Net etkisi, ana sayfanın ID değerlerini, ContentPlaceHolder denetimini ve metin kutusunun kendisini içeren bir id özniteliği değeridir.The net effect is an id attribute value consisting of the ID values of the master page, the ContentPlaceHolder control, and the TextBox itself.

Şekil 4 ' te bu davranış gösterilmektedir.Figure 4 illustrates this behavior. Age TextBox 'ın işlenmiş id belirlenmesi için, AgeTextBox denetiminin ID değeri ile başlayın.To determine the rendered id of the Age TextBox, start with the ID value of the TextBox control, Age. Sonra, denetim hiyerarşisi için bir yöntem çalışın.Next, work your way up the control hierarchy. Her adlandırma kapsayıcısında (açık rengi olan bu düğümler), adlandırma kapsayıcısının idgeçerli olarak işlenen id ön eki.At each naming container (those nodes with a peach color), prefix the current rendered id with the naming container's id.

Işlenmiş kimlik öznitelikleri, adlandırma kapsayıcılarının KIMLIK değerlerine dayalıdır

Şekil 04: Işlenmiş id öznitelikleri, adlandırma kapsayıcılarının ID değerlerine dayalıdırFigure 04: The Rendered id Attributes are Based On the ID Values of the Naming Containers

Note

Tartışıyoruz, işlenmiş id özniteliğinin ctl00 kısmı ana sayfanın ID değerini oluşturur, ancak bu ID değerin nasıl geldiğini merak ediyor olabilirsiniz.As we discussed, the ctl00 portion of the rendered id attribute constitutes the ID value of the master page, but you may be wondering how this ID value came about. Ana veya içerik sayfamızda bir yere belirtmedik.We did not specify it anywhere in our master or content page. Bir ASP.NET sayfasındaki çoğu sunucu denetimi, sayfanın bildirim temelli işaretlemesi aracılığıyla açıkça eklenir.Most server controls in an ASP.NET page are added explicitly through the page's declarative markup. MainContent ContentPlaceHolder denetimi, Site.masterbiçimlendirmesinde açıkça belirtilmiştir; Age metin kutusu IDIssues.aspxbiçimlendirmesi olarak tanımlandı.The MainContent ContentPlaceHolder control was explicitly specified in the markup of Site.master; the Age TextBox was defined IDIssues.aspx's markup. Bu denetim türlerinin ID değerlerini Özellikler penceresi veya bildirime dayalı sözdiziminden belirteceğiz.We can specify the ID values for these types of controls through the Properties window or from the declarative syntax. Ana sayfanın kendisi gibi diğer denetimler, bildirim temelli biçimlendirmede tanımlanmamıştır.Other controls, like the master page itself, are not defined in the declarative markup. Sonuç olarak, ID değerlerinin ABD için otomatik olarak oluşturulması gerekir.Consequently, their ID values must be automatically generated for us. ASP.NET altyapısı, kimlikleri açıkça ayarlanmamış olan denetimler için çalışma zamanında ID değerlerini ayarlar.The ASP.NET engine sets the ID values at runtime for those controls whose IDs have not been explicitly set. ctlXXadlandırma modelini kullanır, burada xx sıralı olarak artan tamsayı değeridir.It uses the naming pattern ctlXX, where XX is a sequentially increasing integer value.

Ana sayfanın kendisi bir adlandırma kapsayıcısı olarak görev yaptığından, ana sayfada tanımlanan Web denetimleri, işlenen id öznitelik değerlerini de değiştirmiş.Because the master page itself serves as a naming container, the Web controls defined in the master page also have altered rendered id attribute values. Örneğin, Ana sayfa Ile site genelinde düzen oluşturma öğreticisinde ana sayfaya eklediğimiz DisplayDate etiketi aşağıdaki işlenmiş biçimlendirmeye sahiptir:For example, the DisplayDate Label we added to the master page in the Creating a Site-Wide Layout with Master Pages tutorial has the following rendered markup:

<span id="ctl00_DateDisplay">current date</span>

id özniteliğinin hem ana sayfanın ID değerini (ctl00) hem de etiketin Web denetiminin ID değerini (DateDisplay) içerdiğini unutmayın.Note that the id attribute includes both the master page's ID value (ctl00) and the ID value of the Label Web control (DateDisplay).

3. Adım: program aracılığıyla Web denetimlerine başvurmaFindControlStep 3: Programmatically Referencing Web Controls viaFindControl

Her ASP.NET sunucu denetimi, denetimin alt öğelerinden ControlIDadlı bir denetim için arama yapan bir FindControl("controlID") yöntemi içerir.Every ASP.NET server control includes a FindControl("controlID") method that searches the control's descendents for a control named controlID. Böyle bir denetim bulunursa, döndürülür; eşleşen bir denetim bulunamazsa, FindControl Nothingdöndürür.If such a control is found, it is returned; if no matching control is found, FindControl returns Nothing.

FindControl, bir denetime erişmeniz gereken ancak kendisine doğrudan başvurmayan senaryolarda yararlıdır.FindControl is useful in scenarios where you need to access a control but you don't have a direct reference to it. GridView gibi veri Web denetimleriyle çalışırken, örneğin, GridView 'un alanlarındaki denetimler bildirim temelli sözdiziminde bir kez tanımlanır, ancak çalışma zamanında her GridView satırı için bir denetimin örneği oluşturulur.When working with data Web controls like the GridView, for example, the controls within the GridView's fields are defined once in the declarative syntax, but at runtime an instance of the control is created for each GridView row. Sonuç olarak, çalışma zamanında oluşturulan denetimler mevcuttur, ancak arka plan kod sınıfından kullanılabilecek doğrudan bir başvuruya sahip değildir.Consequently, the controls generated at runtime exist, but we do not have a direct reference available from the code-behind class. Sonuç olarak, GridView 'un alanları içindeki belirli bir denetimle programlı bir şekilde çalışmak için FindControl kullanmanız gerekir.As a result we need to use FindControl to programmatically work with a specific control within the GridView's fields. (Bir veri Web denetiminin şablonları içindeki denetimlere erişmek için FindControl kullanma hakkında daha fazla bilgi için, bkz. verileri temel alan özel biçimlendirme.) Bu senaryo, dinamik veri girişi kullanıcı arabirimleri oluşturmabölümünde ele alınan bir konu olan Web formuna dinamik olarak Web denetimleri eklerken meydana gelir.(For more information on using FindControl to access the controls within a data Web control's templates, see Custom Formatting Based Upon Data.) This same scenario occurs when dynamically adding Web controls to a Web Form, a topic discussed in Creating Dynamic Data Entry User Interfaces.

Bir içerik sayfasında denetimleri aramak için FindControl yöntemini kullanmayı göstermek için, SubmitButton``Click olayı için bir olay işleyicisi oluşturun.To illustrate using the FindControl method to search for controls within a content page, create an event handler for the SubmitButton's Click event. Olay işleyicisinde, FindControl yöntemini kullanarak Age TextBox ve Results etiketine programlı olarak başvuran aşağıdaki kodu ekleyin ve ardından kullanıcının girişine göre Results bir ileti görüntüler.In the event handler, add the following code, which programmatically references the Age TextBox and Results Label using the FindControl method and then displays a message in Results based on the user's input.

Note

Tabii ki, bu örnek için etiket ve metin kutusu denetimlerine başvurmak üzere FindControl kullanmıyoruz.Of course, we don't need to use FindControl to reference the Label and TextBox controls for this example. Bunlara ID özellik değerleri aracılığıyla doğrudan başvuracağız.We could reference them directly via their ID property values. Bir içerik sayfasından FindControl kullanırken ne olduğunu göstermek için FindControl burada kullanıyorum.I use FindControl here to illustrate what happens when using FindControl from a content page.

Protected Sub SubmitButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SubmitButton.Click
 Dim ResultsLabel As Label = CType(FindControl("Results"), Label)
 Dim AgeTextBox As TextBox = CType(Page.FindControl("Age"), TextBox)

 ResultsLabel.Text = String.Format("You are {0} years old!", AgeTextBox.Text)
End Sub

FindControl yöntemini çağırmak için kullanılan sözdizimi, SubmitButton_Clickilk iki satırda biraz farklı olsa da, anlamsal olarak eşdeğerdir.While the syntax used to call the FindControl method differs slightly in the first two lines of SubmitButton_Click, they are semantically equivalent. Tüm ASP.NET Server denetimlerinin bir FindControl yöntemi içerdiğini hatırlayın.Recall that all ASP.NET server controls include a FindControl method. Bu, tüm ASP.NET arka plan kod sınıflarının türetmesini gerektiren Page sınıfını içerir.This includes the Page class, from which all ASP.NET code-behind classes must derive from. Bu nedenle, FindControl("controlID") çağrısı Page.FindControl("controlID")çağırma ile eşdeğerdir, ancak arka plan kod sınıfında veya özel bir temel sınıfta FindControl yöntemini geçersiz kılmadığınız varsayılır.Therefore, calling FindControl("controlID") is equivalent to calling Page.FindControl("controlID"), assuming you haven't overridden the FindControl method in your code-behind class or in a custom base class.

Bu kodu girdikten sonra tarayıcıda IDIssues.aspx sayfasını ziyaret edin, yaşını girin ve "Gönder" düğmesine tıklayın.After entering this code, visit the IDIssues.aspx page through a browser, enter your age, and click the "Submit" button. "Gönder" düğmesine tıklandıktan sonra bir NullReferenceException tetiklenir (bkz. Şekil 5).Upon clicking the "Submit" button a NullReferenceException is raised (see Figure 5).

Bir NullReferenceException tetiklenirA NullReferenceException is Raised

Şekil 05: bir NullReferenceException tetiklenir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 05: A NullReferenceException is Raised (Click to view full-size image)

SubmitButton_Click olay işleyicisinde bir kesme noktası ayarlarsanız, FindControl Nothingdöndüren her iki çağrının de olduğunu görürsünüz.If you set a breakpoint in the SubmitButton_Click event handler you will see that both calls to FindControl return Nothing. NullReferenceException, Age TextBox 'ın Text özelliğine erişmeye çalıştıklarında tetiklenir.The NullReferenceException is raised when we attempt to access the Age TextBox's Text property.

Sorun, yalnızca denetiminaynı adlandırma kapsayıcısında olan alt öğelerinden yalnızca arama Control.FindControl.The problem is that Control.FindControl only searches Control's descendents that are in the same naming container. Ana sayfa yeni bir adlandırma kapsayıcısı oluşturduğundan, Page.FindControl("controlID") bir çağrı ana sayfa nesnesinin ctl00hiçbir şekilde hiçbir şekilde hiçbir şekilde değildir.Because the master page constitutes a new naming container, a call to Page.FindControl("controlID") never permeates the master page object ctl00. (Page nesnesini ana sayfa ctl00nesnesinin üst öğesi olarak gösteren denetim hiyerarşisini görüntülemek için Şekil 4 ' e geri dönün.) Bu nedenle, Results etiketi ve Age metin kutusu bulunamadı ve ResultsLabel ve AgeTextBox Nothingdeğerler atanır.(Refer back to Figure 4 to view the control hierarchy, which shows the Page object as the parent of the master page object ctl00.) Therefore, the Results Label and Age TextBox are not found and ResultsLabel and AgeTextBox are assigned values of Nothing.

Bu zorluk için iki geçici çözüm vardır: aynı anda bir adlandırma kapsayıcısı, uygun denetime göre ayrıntıya gidebiliriz; ya da, ad kapsayıcılarını engelleyen kendi FindControl yöntemi oluşturuyoruz.There are two workarounds to this challenge: we can drill down, one naming container at a time, to the appropriate control; or we can create our own FindControl method that permeates naming containers. Bu seçeneklerin her birini inceleyelim.Let's examine each of these options.

Uygun adlandırma kapsayıcısının detayına gitmeDrilling Into the Appropriate Naming Container

Results etiketine veya Age metin kutusuna başvurmak için FindControl kullanmak için, aynı adlandırma kapsayıcısında bir üst denetimden FindControl çağırdık.To use FindControl to reference the Results Label or Age TextBox, we need to call FindControl from an ancestor control in the same naming container. Şekil 4 ' te gösterildiği gibi, MainContent ContentPlaceHolder denetimi aynı adlandırma kapsayıcısı içindeki Results veya Age tek üst öğesi.As Figure 4 showed, the MainContent ContentPlaceHolder control is the only ancestor of Results or Age that is within the same naming container. Diğer bir deyişle, aşağıdaki kod parçacığında gösterildiği gibi, MainContent denetiminden FindControl yöntemini çağırmak, Results veya Age denetimlerine doğru bir başvuru döndürür.In other words, calling the FindControl method from the MainContent control, as shown in the code snippet below, correctly returns a reference to the Results or Age controls.

Dim ResultsLabel As Label = CType(MainContent.FindControl("Results"), Label)
Dim AgeTextBox As TextBox = CType(MainContent.FindControl("Age"), TextBox)

Ancak, ContentPlaceHolder ana sayfada tanımlandığından, yukarıdaki sözdizimini kullanarak içerik sayfanızın arka plan kod sınıfından ContentPlaceHolder MainContent ile çalışıyoruz.However, we cannot work with the MainContent ContentPlaceHolder from our content page's code-behind class using the above syntax because the ContentPlaceHolder is defined in the master page. Bunun yerine, MainContentbir başvuru almak için FindControl kullandık.Instead, we have to use FindControl to get a reference to MainContent. SubmitButton_Click olay işleyicisindeki kodu aşağıdaki değişikliklerle değiştirin:Replace the code in the SubmitButton_Click event handler with the following modifications:

Protected Sub SubmitButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SubmitButton.Click
 Dim MainContent As ContentPlaceHolder = CType(FindControl("MainContent"), ContentPlaceHolder)

 Dim ResultsLabel As Label = CType(MainContent.FindControl("Results"), Label)
 Dim AgeTextBox As TextBox = CType(MainContent.FindControl("Age"), TextBox)

 ResultsLabel.Text = String.Format("You are {0} years old!", AgeTextBox.Text)
End Sub

Sayfayı bir tarayıcı aracılığıyla ziyaret ederseniz, yaşını girip "Gönder" düğmesine tıkladığınızda bir NullReferenceException oluşturulur.If you visit the page through a browser, enter your age, and click the "Submit" button, a NullReferenceException is raised. SubmitButton_Click olay işleyicisinde bir kesme noktası ayarlarsanız, MainContent nesnesinin FindControl yöntemini çağırmaya çalışırken bu özel durumun oluştuğunu görürsünüz.If you set a breakpoint in the SubmitButton_Click event handler you will see that this exception occurs when attempting to call the MainContent object's FindControl method. FindControl yöntemi "MainContent" adlı bir nesne bulamadığından, MainContent nesnesi Nothing eşittir.The MainContent object is equal to Nothing because the FindControl method cannot locate an object named "MainContent". Temel neden, Results etiketi ve Age metin kutusu denetimleriyle aynıdır: FindControl, arama denetimini denetim hiyerarşisinin en üstünden başlatır ve adlandırma kapsayıcılarını göstermez, ancak MainContent ContentPlaceHolder, bir adlandırma kapsayıcısı olan ana sayfa içindedir.The underlying reason is the same as with the Results Label and Age TextBox controls: FindControl starts its search from the top of the control hierarchy and does not penetrate naming containers, but the MainContent ContentPlaceHolder is within the master page, which is a naming container.

MainContentbir başvuru almak için FindControl kullanabilmeniz için önce ana sayfa denetimine bir başvuruya ihtiyacımız var.Before we can use FindControl to get a reference to MainContent, we first need a reference to the master page control. Ana sayfaya bir başvurduktan sonra, FindControl ile ContentPlaceHolder MainContent bir başvuru alabilir ve buradan, Results etiketine ve Age metin kutusuna (FindControlkullanarak) başvurur.Once we have a reference to the master page we can get a reference to the MainContent ContentPlaceHolder via FindControl and, from there, references to the Results Label and Age TextBox (again, through using FindControl). Ancak ana sayfaya nasıl bir başvuru alırız?But how do we get a reference to the master page? İşlenmiş biçimlendirmede id özniteliklerini inceleyerek ana sayfanın ID değerinin ctl00olması önerilir.By inspecting the id attributes in the rendered markup it's evident that the master page's ID value is ctl00. Bu nedenle, ana sayfaya başvuru almak için Page.FindControl("ctl00") kullanabiliriz, sonra da MainContentbir başvuru almak için bu nesneyi kullanabilirsiniz.Therefore, we could use Page.FindControl("ctl00") to get a reference to the master page, then use that object to get a reference to MainContent, and so on. Aşağıdaki kod parçacığı bu mantığı göstermektedir:The following snippet illustrates this logic:

'Get a reference to the master page
Dim ctl00 As MasterPage = CType(FindControl("ctl00"), MasterPage)

'Get a reference to the ContentPlaceHolder
Dim MainContent As ContentPlaceHolder = CType(ctl00.FindControl("MainContent"), ContentPlaceHolder)

'Reference the Label and TextBox controls
Dim ResultsLabel As Label = CType(MainContent.FindControl("Results"), Label)
Dim AgeTextBox As TextBox = CType(MainContent.FindControl("Age"), TextBox)

Bu kod tamamen çalışacaktır, ana sayfanın otomatik olarak oluşturulan ID her zaman ctl00olacağını varsayar.While this code will certainly work, it assumes that the master page's autogenerated ID will always be ctl00. Otomatik olarak oluşturulan değerler hakkında varsayımlar yapmak hiç iyi bir fikir değildir.It's never a good idea to make assumptions about autogenerated values.

Neyse ki, ana sayfaya yapılan bir başvuruya Page sınıfının Master özelliği aracılığıyla erişilebilir.Fortunately, a reference to the master page is accessible through the Page class's Master property. Bu nedenle, MainContent ContentPlaceHolder öğesine erişmek için ana sayfanın bir başvurusunu almak üzere FindControl("ctl00") kullanmak yerine Page.Master.FindControl("MainContent")de kullanabilirsiniz.Therefore, instead of having to use FindControl("ctl00") to get a reference of the master page in order to access the MainContent ContentPlaceHolder, we can instead use Page.Master.FindControl("MainContent"). SubmitButton_Click olay işleyicisini aşağıdaki kodla güncelleştirin:Update the SubmitButton_Click event handler with the following code:

Protected Sub SubmitButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SubmitButton.Click
 'Get a reference to the ContentPlaceHolder
 Dim MainContent As ContentPlaceHolder = CType(Page.Master.FindControl("MainContent"), ContentPlaceHolder)

 'Reference the Label and TextBox controls
 Dim ResultsLabel As Label = CType(MainContent.FindControl("Results"), Label)
 Dim AgeTextBox As TextBox = CType(MainContent.FindControl("Age"), TextBox)

 ResultsLabel.Text = String.Format("You are {0} years old!", AgeTextBox.Text)
End Sub

Bu kez, sayfayı bir tarayıcı ile ziyaret ederek, yaşını girerek ve "Gönder" düğmesine tıklamak, Results etiketinde iletiyi beklenen şekilde görüntüler.This time, visiting the page through a browser, entering your age, and clicking the "Submit" button displays the message in the Results Label, as expected.

Kullanıcının yaşı etikette görüntülenir The User's Age is Displayed in the Label

Şekil 06: kullanıcının yaşı etikette görüntülenir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 06: The User's Age is Displayed in the Label (Click to view full-size image)

Adlandırma kapsayıcılarında yinelemeli aramaRecursively Searching Through Naming Containers

Önceki kod örneğine, ana sayfadan MainContent ContentPlaceHolder denetimine başvuruldu ve sonra MainContentolan Results etiketi ve Age TextBox denetimleri, Control.FindControl yönteminin yalnızca denetiminadlandırma kapsayıcısı içinde arama yaptığından oluşur.The reason the previous code example referenced the MainContent ContentPlaceHolder control from the master page, and then the Results Label and Age TextBox controls from MainContent, is because the Control.FindControl method only searches within Control's naming container. İki farklı adlandırma kapsayıcılarındaki iki denetim aynı ID değerine sahip olabileceğinden, adlandırma kapsayıcısı içinde FindControl olması çoğu senaryo açısından anlamlı hale gelir.Having FindControl stay within the naming container makes sense in most scenarios because two controls in two different naming containers may have the same ID values. TemplateFields içinde ProductName adlı bir etiket Web denetimi tanımlayan bir GridView 'un durumunu göz önünde bulundurun.Consider the case of a GridView that defines a Label Web control named ProductName within one of its TemplateFields. Veriler GridView 'a çalışma zamanında bağlandığında her GridView satırı için bir ProductName etiketi oluşturulur.When the data is bound to the GridView at runtime, a ProductName Label is created for each GridView row. FindControl tüm adlandırma kapsayıcılarında arama yaptıysanız ve Page.FindControl("ProductName")çağırdık, FindControl hangi etiket örneği döndürmelidir?If FindControl searched through all naming containers and we called Page.FindControl("ProductName"), what Label instance should the FindControl return? İlk GridView satırındaki ProductName etiketi mi?The ProductName Label in the first GridView row? Son satırdaki bir tane?The one in the last row?

Control.FindControl arama yalnızca denetiminadlandırma kapsayıcısı çoğu durumda daha anlamlı hale gelir.So having Control.FindControl search just Control's naming container makes sense in most cases. Ancak, tüm adlandırma kapsayıcıları genelinde benzersiz bir ID olduğu ve bir denetime erişmek için denetim hiyerarşisindeki her adlandırma kapsayıcısına daha fazla başvuru yapmaktan kaçınmak isteyen, bizim gibi başka durumlar da vardır.But there are other cases, such as the one facing us, where we have a unique ID across all naming containers and want to avoid having to meticulously reference each naming container in the control hierarchy to access a control. Tüm adlandırma kapsayıcılarını özyinelemeli olarak arayan FindControl bir değişken olması çok anlamlı olur.Having a FindControl variant that recursively searches all naming containers makes sense, too. Ne yazık ki .NET Framework böyle bir yöntemi içermez.Unfortunately, the .NET Framework does not include such a method.

İyi haber, tüm adlandırma kapsayıcılarını özyinelemeli olarak arayan kendi FindControl yöntemi oluşturabileceğiz.The good news is that we can create our own FindControl method that recursively searches all naming containers. Aslında, genişletme yöntemlerini kullanarak, var olan FindControl yöntemine eşlik etmek için Control sınıfına FindControlRecursive bir yöntemi üzerinde Raptiye yapabilirsiniz.In fact, using extension methods we can tack on a FindControlRecursive method to the Control class to accompany its existing FindControl method.

Note

Uzantı yöntemleri, 3,5 ve Visual Studio C# 2008 .NET Framework sürümü ile birlikte gelen diller Visual Basic 3,0 ve 9 ' a yeni bir özelliktir.Extension methods are a feature new to C# 3.0 and Visual Basic 9, which are the languages that ship with the .NET Framework version 3.5 and Visual Studio 2008. Kısaca uzantı yöntemleri, bir geliştiricinin özel bir sözdizimi aracılığıyla mevcut bir sınıf türü için yeni bir yöntem oluşturmasına izin verir.In short, extension methods allow for a developer to create a new method for an existing class type through a special syntax. Bu yardımcı özellik hakkında daha fazla bilgi için, uzantı yöntemleriyle temel tür Işlevselliğini genişleterekmakaleme bakın.For more information on this helpful feature, refer to my article, Extending Base Type Functionality with Extension Methods.

Uzantı yöntemini oluşturmak için, PageExtensionMethods.vbadlı App_Code klasöre yeni bir dosya ekleyin.To create the extension method, add a new file to the App_Code folder named PageExtensionMethods.vb. controlIDadlı bir String parametresi girişi olarak alan FindControlRecursive adlı bir uzantı yöntemi ekleyin.Add an extension method named FindControlRecursive that takes as an input a String parameter named controlID. Uzantı yöntemlerinin düzgün çalışması için, sınıfın bir Module olarak işaretlenmesi ve genişletme yöntemlerinin <Extension()> özniteliğiyle ön eki olması çok önemlidir.For extension methods to work properly, it is vital that the class be marked as a Module and that the extension methods be prefixed with the <Extension()> attribute. Üstelik, tüm genişletme yöntemleri, ilk parametresi olarak Uzantı yönteminin uygulandığı türün bir nesnesi olarak kabul etmelidir.Moreover, all extension methods must accept as their first parameter an object of the type to which the extension method applies.

Bu Module ve FindControlRecursive uzantısı yöntemini tanımlamak için aşağıdaki kodu PageExtensionMethods.vb dosyasına ekleyin:Add the following code to the PageExtensionMethods.vb file to define this Module and the FindControlRecursive extension method:

Imports System.Runtime.CompilerServices

Public Module PageExtensionMethods
 <Extension()> _
  Public Function FindControlRecursive(ByVal ctrl As Control, ByVal controlID As String) As Control
 If String.Compare(ctrl.ID, controlID, True) = 0 Then
 ' We found the control!
 Return ctrl
 Else
 ' Recurse through ctrl's Controls collections
 For Each child As Control In ctrl.Controls
 Dim lookFor As Control = FindControlRecursive(child, controlID)

 If lookFor IsNot Nothing Then
 Return lookFor  ' We found the control
 End If
 Next

 ' If we reach here, control was not found
 Return Nothing
 End If
 End Function
End Module

Bu kodla birlikte IDIssues.aspx sayfanın arka plan kod sınıfına dönün ve geçerli FindControl yöntemi çağrılarını not edin.With this code in place, return to the IDIssues.aspx page's code-behind class and comment out the current FindControl method calls. Bunları Page.FindControlRecursive("controlID")çağrılarıyla değiştirin.Replace them with calls to Page.FindControlRecursive("controlID"). Uzantı yöntemleriyle ilgili yenilikler, doğrudan IntelliSense açılan listelerinde görünürler.What's neat about extension methods is that they appear directly within the IntelliSense drop-down lists. Şekil 7 ' de gösterildiği gibi, Page yazdığınızda ve sonra da nokta tuşuna bastığınızda, FindControlRecursive yöntemi diğer Control sınıfı yöntemleriyle birlikte IntelliSense açılır.As Figure 7 shows, when you type Page and then hit period, the FindControlRecursive method is included in the IntelliSense drop-down along with the other Control class methods.

uzantısı yöntemleri, IntelliSense açılır listeleri 'ne dahildirExtension Methods are Included in the IntelliSense Drop-Downs

Şekil 07: uzantı yöntemleri, IntelliSense açılan listeleri 'ne dahildir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 07: Extension Methods are Included in the IntelliSense Drop-Downs (Click to view full-size image)

SubmitButton_Click olay işleyicisine aşağıdaki kodu girin ve ardından sayfayı ziyaret ederek, yaşınızı girerek ve "Gönder" düğmesine tıklayarak test edin.Enter the following code into the SubmitButton_Click event handler and then test it by visiting the page, entering your age, and clicking the "Submit" button. Şekil 6 ' da gösterildiği gibi, sonuçta elde edilen çıktı, "yaş yıllardır!" iletisi olacaktır.As shown back in Figure 6, the resulting output will be the message, "You are age years old!"

Protected Sub SubmitButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SubmitButton.Click
 Dim ResultsLabel As Label = CType(Page.FindControlRecursive("Results"), Label)
 Dim AgeTextBox As TextBox = CType(Page.FindControlRecursive("Age"), TextBox)

 ResultsLabel.Text = String.Format("You are {0} years old!", AgeTextBox.Text)
End Sub

Note

Uzantı yöntemleri C# 3,0 ve Visual Basic 9 ' a yeni olduklarından, Visual Studio 2005 kullanıyorsanız uzantı yöntemlerini kullanamazsınız.Because extension methods are new to C# 3.0 and Visual Basic 9, if you are using Visual Studio 2005 you cannot use extension methods. Bunun yerine, FindControlRecursive yöntemini bir yardımcı sınıfında uygulamanız gerekir.Instead, you'll need to implement the FindControlRecursive method in a helper class. Rick Strahl , blog gönderisine, ASP.net Maser sayfalarına ve FindControlbir örnektir.Rick Strahl has such an example in his blog post, ASP.NET Maser Pages and FindControl.

4. Adım: Istemci tarafı betikte doğruidöznitelik değerini kullanmaStep 4: Using the CorrectidAttribute Value in Client-Side Script

Bu öğreticinin giriş bölümünde belirtildiği gibi, bir Web denetiminin işlenmiş id özniteliği, belirli bir HTML öğesine programlı bir şekilde başvurmak için istemci tarafı betikte kullanılan kullanım zamanıdır.As noted in this tutorial's introduction, a Web control's rendered id attribute is oftentimes used in client-side script to programmatically reference a particular HTML element. Örneğin, aşağıdaki JavaScript id bir HTML öğesine başvurur ve sonra değerini bir kalıcı ileti kutusunda görüntüler:For example, the following JavaScript references an HTML element by its id and then displays its value in a modal message box:

var elem = document.getElementById("Age");
if (elem != null)
    alert("You entered " + elem.value + " into the Age text box.");

ASP.NET sayfalarında bir adlandırma kapsayıcısı içermeyen, işlenmiş HTML öğesinin id özniteliği Web denetiminin ID Özellik değeri ile aynı olduğunu hatırlayın.Recall that in ASP.NET pages that do not include a naming container, the rendered HTML element's id attribute is identical to the Web control's ID property value. Bu nedenle, id öznitelik değerleri ile JavaScript koduna sabit koda sahiptir.Because of this, it is tempting to hard code in id attribute values into JavaScript code. Diğer bir deyişle, Age metin kutusu Web denetimine istemci tarafı komut dosyası aracılığıyla erişmek istediğinizi biliyorsanız, bunu document.getElementById("Age")çağrısı aracılığıyla yapın.That is, if you know you want to access the Age TextBox Web control through client-side script, do so via a call to document.getElementById("Age").

Bu yaklaşımda sorun, ana sayfalar (veya diğer adlandırma kapsayıcı denetimleri) kullanılırken, işlenmiş HTML id Web denetiminin ID özelliği ile eş anlamlı olmadığı bir sorundur.The problem with this approach is that when using master pages (or other naming container controls), the rendered HTML id is not synonymous with the Web control's ID property. İlk eğim, sayfayı bir tarayıcı aracılığıyla ziyaret edip gerçek id özniteliğini belirleyecek kaynağı görüntüleyebiliriz.Your first inclination may be to visit the page through a browser and view the source to determine the actual id attribute. İşlenmiş id değerini öğrendikten sonra, istemci tarafı komut dosyası aracılığıyla birlikte çalışmanız gereken HTML öğesine erişmek için getElementById çağrısına yapıştırabilirsiniz.Once you know the rendered id value, you can paste it into the call to getElementById to access the HTML element you need to work with through client-side script. Bu yaklaşım ideal olandan daha küçüktür çünkü sayfanın denetim hiyerarşisinde veya adlandırma denetimlerinin ID özelliklerinde yapılan değişiklikler, elde edilen id özniteliğini değiştirecek ve böylece JavaScript kodunuzu bozacaktır.This approach is less than ideal because certain changes to the page's control hierarchy or changes to the ID properties of the naming controls will alter the resulting id attribute, thereby breaking your JavaScript code.

İyi haber, işlenen id öznitelik değerinin Web denetiminin ClientID özelliğiaracılığıyla sunucu tarafı kodda erişilebilir olması.The good news is that the id attribute value that is rendered is accessible in server-side code through the Web control's ClientID property. İstemci tarafı betikte kullanılan id öznitelik değerini öğrenmek için bu özelliği kullanmanız gerekir.You should use this property to determine the id attribute value used in client-side script. Örneğin, bu sayfaya bir JavaScript işlevi eklemek için, çağrıldığında, Age metin kutusunun değerini bir kalıcı ileti kutusunda görüntüler, Page_Load olay işleyicisine aşağıdaki kodu ekleyin:For example, to add a JavaScript function to the page that, when called, displays the value of the Age TextBox in a modal message box, add the following code to the Page_Load event handler:

ClientScript.RegisterClientScriptBlock(Me.GetType(), "ShowAgeTextBoxScript", _
 "function ShowAge() " & vbCrLf & _
 "{" & vbCrLf & _
 " var elem = document.getElementById('" & AgeTextBox.ClientID & "');" & vbCrLf & _
 " if (elem != null)" & vbCrLf & _
 " alert('You entered ' + elem.value + ' into the Age text box.');" & vbCrLf & _
 "}", True)

Yukarıdaki kod, Age TextBox 'ın ClientID özelliğinin değerini getElementByIdiçin JavaScript çağrısına çıkartır.The above code injects the value of the Age TextBox's ClientID property into the JavaScript call to getElementById. Bu sayfayı bir tarayıcı aracılığıyla ziyaret ederseniz ve HTML kaynağını görüntülediğinizde, aşağıdaki JavaScript kodunu bulacaksınız:If you visit this page through a browser and view the HTML source, you'll find the following JavaScript code:

<script type="text/javascript">
//<![CDATA[
function ShowAge()
{
 var elem = document.getElementById('ctl00_MainContent_Age');
 if (elem != null)
 alert('You entered ' + elem.value + ' into the Age text box.');
}//]]>
</script>

ctl00_MainContent_Age``id özniteliği değerinin getElementByIdçağrısı içinde nasıl göründüğünü unutmayın.Notice how the correct id attribute value, ctl00_MainContent_Age, appears within the call to getElementById. Bu değer çalışma zamanında hesaplandığı için, sayfa denetimi hiyerarşisinde daha sonraki değişikliklerden bağımsız olarak da kullanılır.Because this value is calculated at runtime, it works regardless of later changes to the page control hierarchy.

Note

Bu JavaScript örneği yalnızca bir sunucu denetimi tarafından işlenen HTML öğesine doğru şekilde başvuran bir JavaScript işlevinin nasıl ekleneceğini gösterir.This JavaScript example merely shows how to add a JavaScript function that correctly references the HTML element rendered by a server control. Bu işlevi kullanmak için, belge yüklendiğinde veya belirli bir kullanıcı eylemi transpires olduğunda işlevi çağırmak için ek JavaScript yazmak gerekir.To use this function you would need to author additional JavaScript to call the function when the document loads or when some specific user action transpires. Bu ve ilgili konular hakkında daha fazla bilgi için, Istemci tarafı betiği Ile çalışmamakalesini okuyun.For more information on these and related topics, read Working with Client-Side Script.

ÖzetSummary

Bazı ASP.NET Server denetimleri, kendi alt denetimlerinin işlenmiş id öznitelik değerlerini ve FindControl yöntemi tarafından canvassed 'ın kapsamını etkileyen adlandırma kapsayıcıları olarak davranır.Certain ASP.NET server controls act as naming containers, which affects the rendered id attribute values of their descendent controls as well as the scope of controls canvassed by the FindControl method. Ana sayfaların yanı sıra, ana sayfanın kendisi ve ContentPlaceHolder denetimleri adlandırma kapsayıcılarıdır.With regards to master pages, both the master page itself and its ContentPlaceHolder controls are naming containers. Sonuç olarak, FindControlkullanarak içerik sayfası içindeki denetimlere programlı bir şekilde daha fazla iş yerleştirmemiz gerekir.Consequently, we need to put forth a bit more work to programmatically reference controls within the content page using FindControl. Bu öğreticide, iki teknik inceliyoruz: ContentPlaceHolder denetimine detaya gitme ve FindControl metodunu çağırma. ve tüm adlandırma kapsayıcılarında yinelemeli olarak arama yapan FindControl kendi uygulamamızı yuvarlama.In this tutorial we examined two techniques: drilling into the ContentPlaceHolder control and calling its FindControl method; and rolling our own FindControl implementation that recursively searches through all naming containers.

Sunucu tarafı sorunları adlandırma kapsayıcılarının yanı sıra, Web denetimlerine başvurmayla ilgili olarak, istemci tarafı sorunları da vardır.In addition to the server-side issues naming containers introduce with regards to referencing Web controls, there are also client-side issues. Adlandırma kapsayıcıları yokluğunda, Web denetiminin ID Özellik değeri ve işlenmiş id öznitelik değeri aynı bir değerdir.In the absence of naming containers, the Web control's ID property value and rendered id attribute value are one in the same. Ancak, adlandırma kapsayıcısının eklenmesiyle, işlenen id özniteliği Web denetiminin hem ID değerlerini hem de denetim hiyerarşisinin aile içindeki adlandırma kapsayıcısını içerir.But with the addition of naming container, the rendered id attribute includes both the ID values of the Web control and the naming container(s) in its control hierarchy's ancestry. Bu adlandırma sorunları, Web denetiminin ClientID özelliğini kullandığınız ve istemci tarafı betikinizdeki işlenmiş id öznitelik değerini belirlemede olduğu sürece bir sorun değildir.These naming concerns are a non-issue as long as you use the Web control's ClientID property to determine the rendered id attribute value in your client-side script.

Programlamanın kutlu olsun!Happy Programming!

Daha Fazla BilgiFurther Reading

Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:For more information on the topics discussed in this tutorial, refer to the following resources:

Yazar hakkındaAbout the Author

Birden çok ASP/ASP. NET Books ve 4GuysFromRolla.com 'in yazarı Scott Mitchell, 1998 sürümünden bu yana Microsoft Web teknolojileriyle birlikte çalışıyor.Scott Mitchell, author of multiple ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Scott bağımsız danışman, Trainer ve yazıcı olarak çalışıyor.Scott works as an independent consultant, trainer, and writer. En son kitabı, 24 saat içinde ASP.NET 3,5 kendi kendinize eğitimister.His latest book is Sams Teach Yourself ASP.NET 3.5 in 24 Hours. Scott 'a mitchell@4GuysFromRolla.com veya blogundan http://ScottOnWriting.NETüzerinden erişilebilir.Scott can be reached at mitchell@4GuysFromRolla.com or via his blog at http://ScottOnWriting.NET.

Özel olarak teşekkürlerSpecial Thanks To

Bu öğretici serisi birçok yararlı gözden geçirenler tarafından incelendi.This tutorial series was reviewed by many helpful reviewers. Bu öğreticiye yönelik lider gözden geçirenler Zack Jones ve Suçi Barnerjee.Lead reviewers for this tutorial were Zack Jones and Suchi Barnerjee. Yaklaşan MSDN makalelerimi gözden geçiriyor musunuz?Interested in reviewing my upcoming MSDN articles? Öyleyse, beni mitchell@4GuysFromRolla.combir satır bırakın.If so, drop me a line at mitchell@4GuysFromRolla.com.