ارسال صفحه به سرور با استفاده از جاوا اسکریپت
چهارشنبه 24 خرداد 1391 7:02 PM
یکی از بزگترین تغییرات asp.net نسبت به asp کلاسیک، روند ارسال صفحه به سرور است. به گونه ای که صفحات asp.net داده ها را به خودشان ارسال کرده و پردازش میکنند و در بسیاری از شرایط این روند قابل قبول است. اما چنانچه بخواهيد این داده ها را از جای دیگر به این صفحات ارسال کنید، این متد دیگر جوابگو نخواهد بود.
در حال حاظر راههای متعددی برای ارسال صفحات وجود دارد :
1- استفاده از Server.Transfer() برای ارسال فیلدهای مورد نظر به صفحه دیگر. متاسفانه در این روش URL اي که کاربر میبیند تغییر نمیکند
2- ارسال متغیرها توسط query string و استفاده از Response.Redirect(). این متد هم محدودیتهای امنیتی دارد و همچنین طول آن از حد مشخصی نمیتواند تجاوز کند
3- استفاده از روشPOST در HTML . در این حالت با استفاده از یک تابع اطلاعات فیلدها را خوانده و با استفده از یک HTTP POST آنها را به سرور ارسال میکنیم.
4- استفاده از یک فرم HTML به جای یک فرم وب. در این حالت ویژگی runat="server" را از تگ Form حذف میکنیم. متاسفانه در این حالت دیگر کنترلهای اعتبارسنج (validator) دیگر قابل استفاده نیستند.
5- استفاده از یک تابع جاوا اسکریپت که روند رفتار صفحه را در کلاینت تغیر میدهد
در این برنامه ما از روش آخر استفاده خواهیم کرد. مزیت این روش سریع و آسان بودن آن است. به ویژه برای توسعه دهندگانی که به تازگی کار با asp.net را شروع کرده اند. علاوه بر این چانچه بخواهید برنامه هایی که قبلا با asp کلاسیک نوشته اید ر به asp.net منتقل کنید به این روش نیاز بیشتری خواهید داشت.
تنها مشکل این روش این است که چنانچه کاربر، جاوا اسکریپت را غیرفعال کرده باشد با مشکل مواجه میشویم و مجبوریم از یکی دیگر از روشهایی که در بالا ذکر شد عمل کنیم.
برای غلبه بر رفتار ارسال صفحات به سرور، 2 مشکل را باید حل کنیم. اولین مشکل ارسال صفحه به خود صفحه است. این مشکل را میتوانیم توسط جاوا اسکریپت و تغییر ویژگی action فرم HTML مورد نظر انجام دهیم. مشکل دیگر محتوای پست است. زمانی که asp.net یک پست را دریافت میکند بدنبال فیلدی به نام __VIEWSTATE در آن میگردد. از آنجایی که هر صفحه __VIEWSTATE مربوط به خود را داراست شما نمیتواند یک __VIEWSTATE نامربوط به هر صفحه ای ارسال کنید. در یر این صورت خطای زیر را دریافت خوهید کرد :
"The viewstate is invalid for this page and might be corrupted."
این خطا حتی در حالتی که سعی کنیم __VIEWSTATE را ویرایش کنیم نیز رخ میدهد. کاری که ما در اینجا انجام میدهیم تغییر نام __VIEWSTATE به یک نام دیگر است.
همانگونه که در کد زیر میبینیم از تابع noPostBack برای این کار استفاده کرده ایم:
<script language="javascript">
function noPostBack(sNewFormAction)
{
document.forms[0].action = sNewFormAction;
document.forms[0].__VIEWSTATE.name = 'NOVIEWSTATE';
}
</script>
خط اول ویژگی action را به آرگومانی که به تابع ارسال میشود تغییر میدهد. و خط دوم نیز نام __VIEWSTATE را عوض میکند. این نام میتواند هر چیز دیگری نیز باشد جز نام اصلی خودش. البته شما میتوانید محتوای این فیلد را هم برابر با "" بگذارید تا در پهنا باند مصرفی توسط این صفحه نیز صرفه جویی کرده باشید.
پس از انجام این مراحل تنها کافی است که در رخداد Page_Load صفحه مورد نظر، تنها یک خط کد اضافه کنیم:
private void Page_Load(object sender, System.EventArgs e)
{
Submit.Attributes.Add("onclick", "noPostBack('secondform.aspx');");
}
این خط کد باعث میشود تا یک رخداد onclick به دکمه submit افزوده شود. این رخداد موجب میشود زمانی که دکمهsubmit کلیک شد، تابع جاوا اسکریپت مورد نظر ما فراخوانی گردیده و عملیات مورد نظرمان را انجام دهد و سپس عمل اسال انجام گیرد.
اکنون در صفحه مقصد میتوانیم محتویات فیلدها را توسط Request.Form بدست آوریم:
private void Page_Load(object sender, System.EventArgs e)
{
Result.Text = Request.Form["SomeText"].ToString();
}
نکته
از آنجای که هر تگ div یک لایه محسوب میشود، در برخی مرورگرها ماند Netscape 4 برای دسترسی به فرم مورد نظر و فیلدهای آن بایستی آدرس لایه مورد نظر را نیز بدانیم.
کد زیر را در نظر بگیرید:
<div id="Content" name="Content">
<form method="post" id="Form1" runat="server">
</form>
</div>
در این حالت بایستی ابتدا نوع مرورگر را مشخص کنیم و سپس اقدام به آدرس دهی فرم مورد نظر کنیم:
<script language="javascript">
<!--
function noPostBack(sNewFormAction)
{
if(document.layers) //The browser is Netscape 4
{
document.layers['Content'].document.forms[0].__VIEWSTATE.name =
'NOVIEWSTATE';
document.layers['Content'].document.forms[0].action =
sNewFormAction;
}
else //It is some other browser that understands the DOM
{
document.forms[0].action = sNewFormAction;
document.forms[0].__VIEWSTATE.name = 'NOVIEWSTATE';
}
}
-->
</script>
منبع : codeproject.com
کریمی که جهان پاینده دارد تواند حجتی را زنده دارد
دانلود پروژه و کارآموزی و کارافرینی