۱۳۸۷/۰۹/۰۹

آشنايي با انواع Control ID ها در ASP.Net


اگر مطلب تبديل پلاگين‌هاي جي‌كوئري به كنترل‌هاي ASP.Net را مطالعه كرده باشيد، در مورد ClientID بحث شد. با مراجعه به اصول HTML‌ درخواهيم يافت كه هر كنترل يا شيء مربوطه مي‌تواند شامل ID و name باشد. عموما در كدهاي جاوا اسكريپتي براي دسترسي به يك شيء در صفحه از ID آن شيء به صورت document.getElementById استفاده شده و از name براي پردازش‌هاي سمت سرور استفاده مي‌شود. براي مثال اگر به دوران ASP كلاسيك برگرديم، از شيء Request براي دريافت مقادير ارسال شده به سرور با استفاده از name شيء مورد نظر استفاده مي‌شد/مي‌شود.
در حالت فرم‌هاي معمولي ، ID و name عموما يكسان هستند. اما اگر از master page ها استفاده شود يا از يك user control براي تركيب چندين كنترل كمك گرفته شود، ديگر ID و name در فرم رندر شده نهايي ASP.Net يكسان نخواهند بود. براي مثال:
<input name="ctl00$ContentPlaceHolder1$txtID" type="text" id="ctl00_ContentPlaceHolder1_txtID" />

اگر به سورس دات نت فريم ورك مراجعه كنيم علت وجود _ بجاي $ را در مقدار id مي‌توان مشاهده كرد:

public virtual string ClientID
{
get
{
this.EnsureID();
string uniqueID = this.UniqueID;
if ((uniqueID != null) && (uniqueID.IndexOf(this.IdSeparator) >= 0))
{
return uniqueID.Replace(this.IdSeparator, '_');
}
return uniqueID;
}

}

و جهت توليد name به صورت زير عمل مي‌شود (يك الگوريتم بازگشتي است):
<Container>$<Container>$<Container>$<Container>$...$<ID>

زمانيكه يك كنترل توسط ASP.Net رندر مي‌شود، خاصيت UniqueID معادل name آن و ClientID معادل ID آن كنترل در سمت كلاينت خواهد بود. اگر از IE استفاده كنيد به هر نحوي سعي در پردازش اسكريپت شما خواهد كرد و document.getElementById بالاخره جواب خواهد داد. اما اگر از ساير مرورگرها استفاده كنيد، در صورتيكه بجاي ID از name استفاده شده باشد، اسكريپت شما با پيغامي مبني بر يافت نشدن شيء مورد نظر متوقف خواهد شد (چون مقدار اين‌دو همانطور كه ملاحظه كرديد الزاما يكسان نخواهد بود).
اين نكته در طراحي كنترل‌هاي ASP.Net كه از كدهاي جاوا اسكريپتي استفاده مي‌كنند بسيار مهم است. در تست اول و با يك صفحه ساده كنترل شما خوب كار خواهد كرد. اما اگر همين كنترل را بر روي يك صفحه مشتق شده از يك master page قرار دهيد، ديگر ID آن يافت نشده و كدهاي جاوا اسكريپتي شما كار نخواهند كرد. به همين جهت اگر قرار است قسمت جاوا اسكريپتي كنترل شما توسط كنترل به صورت خودكار ايجاد شود و در اين كد ارجاعي به شيء جاري وجود دارد، اين شيء جاري با استفاده از ClientID آن در سمت كلاينت قابل دسترسي خواهد بود و نه با استفاده از ID سمت سرور و يا UniqueID آن.