آدرس دادن فایل های جاوا اسکریپت به صورت داینامیک
  یکی از مشکلاتی که توسعه گران برنامه های تحت وب با آن روبرو هستند،آدرس دادن فایهای جاوا اسکریپت به صورت داینامیک می باشد. این مشکل معمولا در MasterPage ها خود را نمایان می سازد.
   ASP.NET
   ۱۱۰۴۰
   این مقاله حاوی فایل ضمیمه نمی باشد
   مرتضی صحراگرد
   ۱۳۸۸/۷/۱۱
ارسال لینک صفحه برای دوستان ارسال لینک صفحه برای دوستان  اضافه کردن به علاقه مندیها اضافه کردن به علاقه مندیها   نسخه قابل چاپ نسخه قابل چاپ

 

یکی از مشکلاتی که توسعه گران برنامه های تحت وب با آن روبرو هستند،آدرس دادن فایهای جاوا اسکریپت به صورت داینامیک می باشد. این مشکل معمولا در MasterPage ها خود را نمایان می سازد.

دلیل این موضوع این است که صفحاتی که از یک MasterPage استفاده می کنند، می توانند در آدرس های مختلف و پوشه های مختلف وجود داشته باشند و در نتیجه باید آدرس این فایل جاوا اسکریپت در زمان اجرا (RunTime) ساخته شود.

اولین راه حلی که معمولا به ذهن برنامه نویسان ASP.NET می رسد، استفاده از روش زیر می باشد.

<head runat="server">

<script src='<%= ResolveUrl("~/App_Themes/Theme1/jquery-1.3.1.js")%>' language="javascript" type="text/javascript" >

</script>

</head>

ولی این روش کارساز نیست و اگر شما برنامه را اجرا نمایید، با خطای زیر مواجه می شوید.

The Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>).

برای حل این مشکل، راه حل های متفاوتی وجود دارد. یکی از این راه حل ها این است که در CodeBehind صفحه،  آدرس محل قرار گیری فایل را محاسبه نموده و با استفاده از  Page.Header.Controls  به قسمت Head صفحه اضافه نمایییم. (قبلا در مقاله ای به معرفی این روش پرداخته ام)

روش دیگر این است که در قسمت Head این MasterPage یک کنترل ContentPlaceHolder قرار داده و در صفحات داخلی اسکریپت را به Head اضافه نماییم. که روش چندان جالبی نمی باشد.

اما روش بسیار جالب دیگری نیز وجود دارد.

در این روش، آدرس دهی را به شکل زیر انجام می دهیم. (دقت کنید که در این روش از علامت "#" که مربوط به بایند کردن می باشد، استفاده نموده ایم)

<head runat="server">

<script src='<%# ResolveUrl("~/App_Themes/Theme1/jquery-1.3.1.js")%>' language="javascript" type="text/javascript" >

</script>

</head>

تنها کار باقی مانده این است که در رویداد Load مربوط به MasterPage قطعه کد زیر را اضافه نماییم.

protected void Page_Load(object sender, EventArgs e)

{

    Page.Header.DataBind();

}

برنامه را اجرا کنید و نتیجه را ملاحظه نمایید.