مفهوم Smart Navigation و فواید آن

مفهوم Smart Navigation و فواید آن

Smart Navigation یکى از بهترین ابزارهاى جدیدى است که ASP.NET آنرا عرضه کرده است. این ابزار جدید باعث شده ظاهر برنامه هاى وب و احساسى که نسبت به آن وجود دارد شباهت بیشترى با برنامه هاى عادى و نوشته شده براى ویندوز پیدا کند.

یکى از موانع بزرگ برنامه هاى تحت وب به معمارى و ساختار HTTP برمى گردد. جاییکه مجبوریم اطلاعات جمع آورى شده در سمت مشترى را به سرور بازگردانیم. به همین دلیل مجبور به رسم مجدد و کامل صفحه اى که قبلا دیده ایم مى باشیم، که این نه تنها باعث مى شود یک حالت فلش مانند در این رفت و برگشت و رسم مجدد رخ دهد، بلکه براى صفحه هاى بلند که براى دیدن تمام صفحه نیازمند بهscrolling هستیم، باعث مى شود که دیدمان را به اول صفحه انتقال دهد، چیزى که هم شاید دلخواه ما نباشد و هم اینکه ممکن است باعث سردرگمى کاربر گردد. همچنین این فرآیند باعث تغییر فوکوس کنترل ها و بسیارى از اتفاقات دیگرنیز مى شود.

در برنامه هاى عادى ویندوز ما به طور معمول فقط قسمت هایى از صفحه را به روز مى کنیم که تغییرى در آن ایجاد شده باشد یا تحت تاثیر چیزى قرار گیرند و این بدون نیاز به تغییر در کل برنامه مى باشد (مثلا فقط یک عضو به listbox ما اضافه مى شود. بدون تغییر و رسم مجدد فرم برنامه).

Smart Navigation یا به عبارتى هدایت هوشمندانه این توانایى موجود در برنامه هاى ویندوز را براى برنامه هاى تحت وب فراهم مى کند! اما قبل از هر چیز باید بدانید که این ابزار فقط براى IE مى باشد و آن هم نسخه هاى ۵ به بالاتر آن. با این وجود شما مى توانید Smart Navigation را فعال یا غیرفعال سازید، بدون آنکه تاثیرى در برنامه شما بگذارد. حتى اگر شما در پروژه تان مرورگرهاى محتلفى را مدنظر قرار داده باشید، مى توانید Smart Navigation را فعال سازید. در این صورت ASP.NET نوع مرورگر را تشخیص داده و Smart Navigation را فقط براى مرورگرهاى پشتیبانى شده فعال مى سازد.

چهار مورد برجسته اى که Smart Navigation فراهم مى کند عبارتند از:

• صفحه در میان درخواست ها یک نمایش ممتد را داراست و به عبارتى حالت فلش زدن به خود نمى گیرد.
• موقعیت
Scroll
را حفظ مى کند.
• فوکوس عضو دارنده فوکوس را نگه مى دارد.
• آخرین صفحه درون تاریخچه (
History) نگهدارى مى شود.

این ابزار در حالت واقع گرایانه براى برنامه هایى که ارسال به عقب(!) Postback فراوانى دارند طراحى شده است ولى با توجه به این نکته که محتواى صفحه نباید زیاد تغییر نکند. احتمالا بنا به دلایل کارایى و نه اینکه در تغییرات زیاد ایرادى بهم بزند - مترجم. شاید یک چیز شگفت آور در مورد این ابزار این باشد که شما در حقیقت نیاز به نوشتن هیج کد و برنامه اى ندارید.

نحوه استفاده
Smart Navigation درون هدایت کننده صفحه (Page directive : <%@ %>)، براى تنظیم یک صفحه و درون web.config براى تنظیم کل برنامه استفاده مى شود. براى تنظیم در Page Directive به صورت زیر عمل کنید:

<%@ Page SmartNavigation=true %>

و براى تنظیم در web.config از ساختار زیر استفاده نمایید:

<Configuration>
<System.web>
<Pages SmartNavigation=true />
</System.web>
</Configuration>

روش کار اینگونه است که کل صفحه بدرون یک فریم دورنى مخفى (hidden IFrame) بارگذارى (load) مى شود و سپس فقط قسمت هاى تغییر کرده دوباره رندر(render) مى شوند.

برگرفته از کتاب Professional ASP.NET 1.0 انتشارات Wrox

درس سوم : Namespace چیست؟

Namespace چیست؟
 

یک نکته مهم که در زمان استفاده از NET Framework. باید به آن توجه داشت آن است که فضانام (namespace یا نامکده) ها در ساختمان برنامه کاربردی قرار دارند. فضانام یک طرح نامگذاری منطقی برای گروه بندی کلاس های مرتبط است. این طرح مانع از آن می شود تا کلاس هایی که برای متدها و خصوصیات از یک شناسه یکسان استفاده می کنند تداخل داشته باشند.

مثلا NET Framework. برای گروه بندی تایپ ها به مقوله های منطقی عملکرد، از قبیل چارچوب برنامه کاربردی ASP.NET، از یک طرح نامگذاری سلسله مراتبی استفاده می کند. ابزارهای طراحی از فضانام ها با هدف تسهیل مرور و ارجاع تایپ ها در برنامه بهره برداری می کنند. مثلا فرض کنید در حال نوشتن کد زیر هستید:

Public Class NewClass
   [Procedures and Functions]
End Class

Public Class NewClass
   [Procedures and Functions]
End Class

این کد به خطا منجر می شود چون کامپایلر راهی برای تشخیص کلاس ها از یکدیگر ندارد. برای غلبه بر این مشکل می توان از یک فضانام استفاده کرد که اجازه می دهد دو کلاس همنام در صفحه با هم وجود داشته باشند. قطعه برنامه زیر تعریف این دو کلاس در فضانام های منحصر بفرد را نشان می دهد:

Namespace One
   Public Class NewClass
      [Procedures and Functions]
   End Class
End Namespace

Namespace Two
   Public Class NewClass
      [Procedures and Functions]
   End Class
End Namespace

در این کد برخوردی بین دو کلاس با نام NewClass وجود ندارد چون هر کدام در یک فضانام جداگانه قرار داده شده است. کلاس اول را می توان با استفاده از ترکیب One.NewClass صدا زد، حال آنکه کلاس دوم را می توان با استفاده از ترکیب Two.NewClass صدا زد.

شما می توانید در فضانام های خود از یک ساختار سلسله مراتبی استفاده کنید. قرار دادن اشیاء مشابه تحت زیرعنوانها در یک فضانام مشترک تشخیص هدف فضانام را آسانتر می کند، و در عین حال باعث می شود برنامه به مراتب شئ گراتر شود.

برای توضیح فضانام می توان ساختار فایل و دایرکتوری (کشو، فولدر) در یک کامپیوتر را در نظر گرفت. در این مثال کلاس ها به مثابه فایل ها و فضانام ها مانند دایرکتوری ها هستند. بدیهی است همانگونه که می توانیم دایرکتوریهای تو در تو داشته باشیم، فضانام ها هم در حالیکه کلاس ها را در خود جای داده اند می توانند بصورت تو در تو باشند.

فضانام ها در ساخت برنامه های کاربردی ASP.NET نقش مهمی ایفا می کنند. خوشبختانه لازم نیست برای همه اشیایی که می توانند به وسیله صفحات ASP.NET مورد استفاده قرار بگیرند سیستم طبقه بندی فضانام ایجاد کنید. مایکروسافت این مساله را برای شما حل کرده است. دو فضانام ریشه، و فضانامهای فرزند آنها را می توان وارد صفحات ASP.NET خود کرد. اولی System نامیده می شود، و دومی Microsoft نام دارد. این فضانامها با جزئیات بیشتر در ادامه مورد بحث قرار گرفته اند.

فضانام System
فضانام
System فضانام اصلی برای ساخت ASP.NET و همه برنامه های کاربردی دیگر مبتنی بر NET Framework. است. هر چیزی که در برنامه کاربردی شما قابل انجام باشد از طریق فضانام System کنترل می شود. به عنوان مثال کنترل آرایه، عملیات ریاضی، و تبدیل نوع داده ها از طریق فضانام System و فضانامهای فرزند آن اداره می شوند. ۹ فضانام پیش فرض (فضانام System و ۸ فرزند آن) وجود دارند که به صورت خودکار به صفحات ASP.NET اضافه می شوند:

• System
• System.ComponentModel.Design
• System.Data
• System.Drawing
• System.Web.SessionState
• System.Web
• System.Web.UI
• System.Web.UI.WebControls
• System.Web.UI.HTMLControls

هشت فضانام (بجز فضانام System) در زمان ساخت Visual Studio.NET یا VS.NET بطور خودکار به صفحات ASP.NET وارد می شوند. این فضانام ها در زیر به اختصار شرح داده شده اند.

System.ComponentModel.Design: دربرگیرنده کلاس هایی است که می توان از آنها برای طراحی پشتیبانی سفارشی اجزا و زمان طراحی و دسترسی به سرویس های تامین شده توسط معماری NET Framework. استفاده کرد.

System.Data: امکان دسترسی به کلاس ها و رابطهایی را فراهم می کند که معماری ADO.NET را برای دسترسی به داده های عمومی تشکیل می دهند.

System.Drawing: دربرگیرنده کلاس ها و رابطهایی است که عملکرد گرافیکی اولیه را تامین می کنند. فضانام System.Drawing نیز از طریق فضانام System.Drawing.Drawing2D و System.Drawing.Imaging عملکرد پیشرفته تری فراهم می کند.

System.Web: کلاس ها و رابطهایی تامین می کند که ارتباط مرورگر/سرویس دهنده را امکان پذیر می کنند. این فضانام دربرگیرنده کلاس HTTPRequest (فراهم کننده اطلاعات وسیعی درباره درخواست HTTP جاری)، کلاس HTTPResponse (فراهم آورنده امکان دسترسی به فرآیندها و یوتیلیتی های سمت سرویس 

دهنده) است.

System.Web.SessionState: فراهم کننده کلاس ها و متدهایی برای مدیریت وضعیت جلسات کاری می باشد.

System.Web.UI: فراهم کننده کلاس ها و رابطهایی برای رابط واسط کاربر برنامه کاربردی ASP.NET است که موجب می شوند برنامه کاربردی با سطوح مختلف صفحه، ارتباط برقرار کند. کلاس اصلی این فضانام، کلاس Page می باشد که دربرگیرنده همه خصوصیتها، متدها، و سازنده های صفحه است. اشیاء اصلی Active Server Page زیر خصوصیتهایی در کلاس Page هستند: Application ،Response ،Request ،Server و Session.

System.Web.UI.HTMLControls: کلاس هایی برای عناصر HTML استاندارد، شامل فرم ها، کنترل های ورودی، آنکور، جداول، قسمتهای متنی، و غیره فراهم می کند. این کنترلها همانند تگهای عادی HTML هستند با این تفاوت که داری دو صفت runat="server" و id="controlname" می باشند.

System.Web.UI.HTMLControls: برای کنترلهای سرویس دهنده ای که شبیه کنترلهای HTML هستند ولی انعطاف پذیری بیشتر و عملکرد پیچیده تری دارند کلاس هایی را تامین می کند.

برخی فضانام های مهم و پرکاربرد دیگر به شرح زیر می باشند.

System.IO: دربرگیرنده رابطها و کلاس هایی است که امکان خواندن و نوشتن همگام و غیرهمگام فایل ها و جریانهای داده را فراهم می کنند.

System.Data.OleDb: امکان دسترسی به کلاس ها و رابطهای مخصوص دسترسی به یک منبع داده از طریق ADO را فراهم می کند.

System.Data.SqlClient: امکان دسترسی به کلاس ها و رابطهای مخصوص دسترسی به داده های خاص Microsoft SQL Server از طریق ADO را فراهم می کند.

System.Web.Security: امکان دسترسی به کلاسها و رابطهای مخصوص امنیت برنامه کاربردی ASP.NET را فراهم می کند. دستیابی به رمزنگاری، مجوزها، و تنظیمات خط مشی برنامه کاربردی در این فضانام قرار می گیرند.

System.XML: امکان دسترسی به کلاسها و رابطهای مخصوص پردازش اسناد XML را فراهم می کند.

فضانام Microsoft
علاوه بر فضانام
System که در چارچوب NET. یافت می شود، مایکروسافت چند فضانام اضافه کرده است که برای زبان برنامه سازی ای که می خواهید از آن در برنامه کاربردی خود استفاده کنید عملکرد لازم را تامین می کنند. ممکن است شما بصورت مستقیم با این فضانام کاری نداشته باشید.

Microsoft.VisualBasic: این فضانام محتوی CLR یا زمان اجرای Visual Basic.NET است. از این زمان اجرا با زبان Visual Basic.NET استفاده می شود. این فضانام همچنین دربرگیرنده کلاس هایی است که از کامپایل و تولید کد با استفاده از زبان ویژوال بیسیک پشتیبانی می کنند.

Microsoft.CSharp: این فضای نام دربرگیرنده کلاس هایی است که از کامپایل و تولید کد با استفاده از زبان #C پشتیبانی می کنند.

Microsoft.JScript: این فضای نام دربرگیرنده کلاس هایی است که از کامپایل و تولید کد با استفاده از زبان JScript پشتیبانی می کنند.

Microsoft.Win32: کلاسها و رابطهای مورد نیاز برای کار با کلیدها و hiveهای رجیستری را تامین می کند.

با وجود آنکه فضانام ها از قبل تامین می شوند، می توانید برای استفاده از برنامه کاربردی ASP.NET فضانام های خود را ایجاد کنید. برای هر کلاس ایجاد شده توسط سازنده یک فضانام تولید می شود.

استفاده از فضانام ها در صفحات ASP.NET
دو راه برای افزودن فضانام به برنامه کاربردی
ASP.NET وجود دارد. از شبه دستور (Directive) صفحه Import@ برای صفحات ASPX و از کلمه کلیدی Imports برای افزودن فضانام به برنامه codebehind مربوطه در ویژوال بیسیک استفاده می شود و برای زبان #C از دستور using استفاده می گردد. قطعه برنامه زیر ترکیب نحوی برای افزودن فضانام System.Web.UI.WebControls به صفحه ASP.NET شما است.

<%@ Import namespace = "System.Web.UI.WebControls" %>

همین فضانام را در قسمت codebehind بصورت زیر به برنامه اضافه می کنیم.

Imports System.Web.UI.WebControls (vb.net)

using System.Web.UI.WebControls; (C#)

( به تفاوت Import و Imports دقت کنید )

در صورتیکه می خواهید چند فضانام را به صفحه ASP.NET خود و یا صفحه codebehind اضافه کنید باید هرکدام را جداگانه اضافه کنید. بعنوان مثال، برای افزودن فضانام System.Web.UI.HTMLControls به صفحات با فضانام های موجود، درست بعد از آخرین عبارت مهم به خط بعد بروید و Imports System.Web.UI.HTMLControls را اضافه کنید. به محض آنکه .Imports System را تایپ کنید، VS.NET فهرستی از فضانام ها را ظاهر می کند، و می توانید به سادگی فضانام مورد نظر را با ماوس برگزینید. امتیاز این فهرست آن است که مجبور نیستید همه فضانام های NET. را از حفظ بدانید، بلکه می توانید به آسانی از فهرست انتخاب کنید. این ویژگی با عنوان Intellisense شناخته می شود. برای صفحات ASP.NET از این ترکیب استفاده کنید:

<%@ Import namespace = "System.Web.UI.WebControls" %>
<%@ Import namespace = "System.Web.UI.HTMLControls" %>
<%@ Import namespace = "namespace name" %>
...

برای صفحات codebehind ویژوال بیسیک از این ترکیب استفاده کنید:

Imports System.Web.UI.WebControls
Imports System.Web.UI.HTMLControls
Imports namespace
...

درس دوم : upload کردن فایل به سرور در ASP.NET

upload کردن فایل به سرور در ASP.NET
 

کدهای مربوط به Upload کردن فایل به سرور را باید به دو قسمت تقسیم نمود. قسمت اول شامل کدهایی است که نحوه نمایش در مرورگر را شامل می شوند و اساس آن بر HTML است. و قسمت دوم مربوط به طرف سرور است که شامل کدهایی است که با ASP.NET نوشته می شوند. برنامه زیر حاوی کدهای مربوطه برای انجام این کار به صورات خیلی ساده و ابتدایی می باشد. همانطور که ملاحظه می کنید برخلاف ASP کلاسیک، نیاز به وجود component  خاصی نمی باشد و این کار در ASP.NET بصورت خیلی ساده انجام پذیر است.

Upload.aspx:
<HTML>
<HEAD>
<TITLE>Uploading File...</TITLE>
<Script language="vb" runat="server">
sub page_load(s as object,e as EventArgs)
    If Not (MyInputFile.PostedFile Is Nothing) Then
        MyInputFile.PostedFile.SaveAs("c:filename.ext")
        Response.write("Your File was saved on the server...")
    End If 
end sub
</script>
</HEAD>
<BODY>
    <FORM method="post" encType="multipart/form-data">
        <input id="MyInputFile" type="file" name="MyInputFile" runat="server"> 
        <input type="submit" value="Submit">
    </FORM>
</BODY>
</HTML>

در زیر به شرح و توضیح برنامه بالا می پردازیم:

کدهای مربوط به طرف Client
به دلیل آنکه در این قسمت، ارسال اطلاعات به سرور را داریم، باید کدهای مربوطه درون یک فرم قرار گیرند. اما لازم است که ویژگی
encType آن فرم را به صورت زیر مقدار دهی کنیم، زیرا در غیر اینصورت فایل انتخاب شده توسط کاربر به سرور ارسال نخواهد شد:

encType="multipart/form-data"

در HTML کنترلی وجود دارد که وظیفه دریافت نام فایل و ارسال آن به سرور را عهده دار می باشد:

<input id="MyInputFile" type="file" name="MyInputFile" runat="server">

توجه کنید که این کنترل را به صورت یک سرور کنترل در می آوریم تا بتوانیم در ASP.NET از توانایی های آن استفاده نماییم و به همین دلیل ویژگی runat="server" را به کنترل مربوطه اضافه کرده ایم. بنابراین کد مربوط به قسمت Client به صورت زیر خواهد بود:

<body>
<form method="post" encType="multipart/form-data">
<INPUT id="MyInputFile" type="file" name="MyInputFile" runat="server">
<input type="submit" value="Submit">
</form>
</body>

کدهای مربوط به طرف Server
این قسمت کدهایی را شامل می شود که برای ذخیره کردن فایل بر روی سرویس دهنده مورد استفاده قرار می گیرند.همانطور که گفته شد شئ مربوط به دریافت نام فایل را به صورت سرور کنترل قرار دادیم تا بتوانیم از خصوصیات آن در سرور استفاده کنیم (در اینجا نام آنرا
MyInputFile درنظر گرفته ایم). یکی از خصوصیات این شئ، شئ PostedFile می باشد که به فایل ارسالی توسط کاربر اشاره می کند. این شئ نیز شامل متدی است که اقدام به ذخیره فایل می کند. بنابراین قبل از ذخیره کردن باید مطمئن شد که آیا شئ PostedFile به چیزی اشاره می کند و یا اینکه تهی است. برای این منظور کد مربوط به ذخیره سازی را در شرط زیر قرار می دهیم:

If Not (MyInputFile.PostedFile Is Nothing) Then

و درصورت صحیح بودن شرط، اقدام به ذخیره سازی می نماییم. متد SaveAs شئ PostedFile دارای پارامتری است که محل و نام فایلی که قرار است بر روی سرور ذخیره شود را مشخص می کند. در انتها نیز پیغامی مبنی بر اینکه فایل با موقیت ذخیره شده است را به کاربر می دهیم.

Response.write("Your File was saved on the server successfuly...")

بنابراین کد طرف سرور به صورت زیر خواهد بود:

<script language="vb" runat="server">
   sub page_load(s as object,e as EventArgs)
      If Not (MyInputFile.PostedFile Is Nothing) Then
         MyInputFile.PostedFile.SaveAs("c:filename.ext")
         Response.write("Your File was saved on the server...")
      End If
   end sub
</script>

چند نکته
دیگر خصوصیات شئ
PostedFile به صورت زیر است:
ContentLength: به اندازه فایل ارسالی اشاره میکند.
ContentType: MIME فایل ارسالی را مشخص می کند که در تشخیص نوع فایل دریافتی کمک می کند.
(بعضی از انواع رایج
MIME عبارت اند از : text/plain ، image/gif ، image/jpeg ، audio/mpeg ، application/msword ، application/octed-stream ، video/mpeg ، audio/wav و...)
FileName: نام فایل و مسیر آن در کامپیوتر شخص کاربر را معین می کند.(مانند C:imagespersonalmyface.jpg)
InputStream: یک شئ stream که به فایل upload شده اشاره می کند و آنرا برای خواندن محتوایش آماده می سازد.

یک نکته مهم
توجه کنید که به طور پیش فرض طول داده های ارسالی در یک
request حداکثر 4096 بایت (یا همان 4 kb ) می باشد. بدین معنی که یک فایل ارسالی حداکثر می تواند 4 kb باشد. برای اینکه این مقدار را به مقدار لازم و مورد نیاز افزایش دهید باید در فایل web.config ویا machine.config در قسمت <system.web> در صورتیکه قسمت زیر موجود نیست آنرا اضافه کنید

<httpRuntime maxRequestLength="1000000"/>

ودر صورت وجود مقدار maxRequestLength را به مقدار دلخواه تنظیم کنید. این مقدار بر حسب بایت می باشد. در مثال بالا مقدار ماکزیمم فایل ارسال یک میلیون بایت (حدود 1 MGB) می باشد. به عنوان نمونه یک فایل web.config که فقط نیاز فوق را برآورده سازد به صورت زیر خواهد بود:

Configuration file : web.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration >
   <system.web> 
      <httpRuntime maxRequestLength="1000000" /> 
   </system.web>
</configuration>