آموزش آژاکس

ارسال شده توسط administrator
12. أوت 2010 11:42

 

 

این مقاله، یک برنامه نمونه (sample application) ایجاد می کند که از ویژگی های AJAX ASP.NET استفاده می کند.

شما در این مقاله، برنامه ای خواهید ساخت که صفحات اطلاعات کارمندان را از بانک اطلاعاتی نمونه AdventureWorks نمایش می دهد. این برنامه از کنترل UpdatePanel برای ریفرش کردن تنها بخشی از صفحه که تغییر پیدا کرده است، استفاده می کند؛ بدون اینکه page flashیی که با post back اتفاق می اقتد.این کار، "آپدیت جزیی صفحه" (partial-page update) نامیده می شود. همچنین برنامه نمونه از کنترل UpdateProgress، جهت نمایش پیام وضعیت، هنگامی که آپدیت جزیی صفحه در حال اجرا است، استفاده می کند.

 

پیش نیازها

شما برای پیاده سازی این مقاله، به موارد زیر احتیاج دارید:

  • Microsoft Visual Studio 2005 یا Microsoft Visual Web Developer Express.
  • یک وب سایت ASP.NET با قابلیت AJAX
  • بانک اطلاعاتی نمونه AdventureWorks.

ایجاد وب سایت ASP.NET

وب سایتی که بطور پیش فرض در ASP.NET ایجاد می کنید، قابلیت Microsoft Ajax را ساپورت می کند.

ایجاد یک وب سایت ASP.NET با قابلیت AJAX

  1. Visual Studio را باز کنید.
  2. در منوی File، روی New Web Site کلیک کنید.  ( پنجره New Web Site ظاهر می شود.)
  3. زیر Visual Studio installed templates، گزینه ASP.NET Web Site را انتخاب کنید.
  4. مکان (location) و زبان را وارد کنید و سپس OK کنید.

 

اضافه کردن کنترل UpdatePanel به صفحه وب ASP.NET

بعد از اینکه یک وب سایت ASP.NET ایجاد کردید، باید یک صفحه وب ایجاد کنید که حاوی کنترل UpdatePanel باشد. قبل از اینکه کنترل UpdatePanel را به صفحه اضافه کنید، باید یک کنترل ScriptManager اضافه کنید. کنترل UpdatePanel، وابسته به کنترل ScriptManager، جهت مدیریت کردن آپدیت جزیی صفحه، است.

ایجاد یک صفحه وب ASP.NET

1. در Solution Explorer، روی نام سایت کلیک راست و سپس روی Add New Item کلیک کنید.

پنجره Add New Item ظاهر می شود.

2. زیر Visual Studio installed templates، گزینه Web Form را انتخاب کنید.

3. صفحه جدید Employees.aspx را نامگذاری کنید و تیک گزینه Place code in separate file را بردارید.

4. زبانی را که می خواهید استفاده کنید، انتخاب کنید.

5. روی Add کلیک کنید.

6. به ویووی Design سوییچ کنید.

7. در تب AJAX Extensions در toolbox، روی کنترل ScriptManager دابل کلیک کنید تا آن را به صفحه اضافه کنید.

clip_image001

8. یک کنترل UpdatePanel از toolbox درگ کنید و و زیر کنترل ScriptManager دراپ کنید.

clip_image002

 

اضافه کردن محتوا (content) به کنترل UpdatePanel

کنترل UpdatePanel، آپدیت جزیی صفحه را اجرا می کند و محتوایی را که باید بطور مجزا از بقیه صفحه آپدیت شود، تعیین می کند. در این بخش ار مقاله، باید یک کنترل محدود به داده ها (data-bound) اضافه کنید که داده های بانک اطلاعاتی AdventureWorks را نمایش می دهد.

1. در تب Data در toolbox، یک کنترل GridView به ناحیه قابل ویرایش کنترل UpdatePanel درگ کنید.

2. در منوی GridView Tasks، روی Auto Format کلیک کنید.

3. در پنل Auto Format، زیر Select a scheme، گزینه Colorful را انتخاب و سپس OK کنید.

4. در منوی GridView Tasks، گزینه <New data source> را از لیست Choose Data Source انتخاب کنید.

ویزارد Data Source Configuration ظاهر می شود.

5. زیر Where will the application get data from، گزینه Database را انتخاب و سپس OK کنید.

6. برای مرحله Choose Your Data Connection، در ویزارد Configure Data Source، یک کانکشن به بانک اطلاعاتی AdventureWorks ایجاد کنید و سپس روی کلیک کنید.

7. در مرحله Configure the Select Statement، گزینه Specify a custom SQL statement or stored procedure را انتخاب و سپس روی Next کلیک کنید.

8. در مرحله Define Custom Statement or Stored Procedures، در تب SELECT، عبارت SQL زیر را وارد کنید:

SELECT FirstName, LastName FROM HumanResources.vEmployee ORDER BY LastName, FirstName

9. روی Next کلیک کنید.

10. روی Finish کلیک کنید.

11. در منوی GridView Tasks، چک باکس Enable paging را فعال کنید.

12. تغییرات را ذخیره کنید، و CTRL+F5 را فشار دهید تا صفحه را در مرورگر مشاهده کنید.

توجه داشته باشید هنگام انتخاب صفحه های داده ها، هیچ page flashیی وجود ندارد. به این دلیل که صفحه مورد نظر هیچ postbsck یا هربار آپدیت کردن کل صفحه را اجرا نمی کند.

 

اضافه کردن کنترل UpdateProgress به صفحه

1. کنترل UpdateProgress، هنگام request محتوای جدید کنترل UpdatePanel،یک پیام وضعیت (status message)، نشان می دهد.

2. یک کنترل UpdateProgress از تب AJAX Extensions درtoolbox، روی صفحه درگ کنید و آن را زیر کنترل UpdatePanel دراپ کنید.

3. کنترل UpdateProgress را انتخاب کنید، و در پنجره Properties، پراپرتی AssociatedUpdatePanelID را روی UpdatePanel1 تنظیم کنید.

این کار، کنترل UpdateProgress را به کنترل UpdatePanel، که قبلاً اضافه کرده اید، مرتبط می کند.

4. در ناحیه قابل ویرایش کنترل UpdateProgress،عبارت Getting Employees ... را تایپ کنید.

5. تغییرات را ذخیره کنید، و CTRL+F5 را فشار دهید تا صفحه را در مرورگر مشاهده کنید.

اگر هنگامی که صفحه، SQL query را اجرا می کند و داده ها را باز می گرداند تاخیری وجود داشته باشد، کنترل UpdateProgress، پیامی را نمایش می دهد که در کنترل UpdateProgress وارد کرده اید.

اضافه کردن Delay به Sample Application

اگر برنامه شما هر صفحه داده را سریعاً آپدیت می کند، شاید محتوای کنترل UpdateProgress را روی صفحه نبینید. این کنترل، پراپرتی DisplayAfter را، که شما را قادر می کند یک تاخیر (delay) قبل از نمایش کنترل قرار دهید، ساپورت می کند. این کار، اگر آپدیت خیلی سریع اتفاق بیافتد، کنترل را از flashing در مرورگر باز می دارد. این تاخیر بطور پیش فرض، روی 500 میلی ثانیه (نصف ثانیه) تنظیم است، بدین معنی که اگر آپدیت کمتر از نیم ثانیه طول بکشد، کنترل UpdateProgress نمایش داده نخواهد شد.

در محیط development، می توانید یک تاخیر مصنوعی به برنامه تان اضافه کنید تا مطمئن شوید که کنترل UpdateProgress همانطور که انتظار می رفت عمل می کند. این کار اختیاری است و فقط برای تست کردن برنامه تان است.

1. درون کنترل UpdatePanel، کنترل GridView را انتخاب کنید.

2. در پنجره Properties، روی دکمه Events کلیک کنید.

3. روی ایونت PageIndexChanged دابل کلیک کنید تا یک event handler ایجاد کنید.

4. کد زیر را به ایونت هندلر PageIndexChanged اضافه کنید تا یک تاخیر سه ثانیه ای ایجاد کنید.

در VB:

'Include three second delay for example only.
System.Threading.Thread.Sleep(3000)

 

در C#:

//Include three second delay for example only.
System.Threading.Thread.Sleep(3000);

 

5. تغییرات را ذخیره کنید، و CTRL+F5 را فشار دهید تا صفحه را در مرورگر مشاهده کنید.

از آنجاییکه حالا هر دفعه که به صفحه جدیدی از داده ها می رویم یک تاخیر سه ثانیه ای داریم، می توانید کنترل UpdateProgress را ببینید.

در VB:

<%@ Page Language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

Protected Sub GridView1_PageIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)
'Include three second delay for example only.
System.Threading.Thread.Sleep(3000)
End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>

</div>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" CellPadding="4" DataSourceID="SqlDataSource1"
ForeColor="#333333" GridLines="None" OnPageIndexChanged="GridView1_PageIndexChanged">
<FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
<RowStyle BackColor="#FFFBD6" ForeColor="#333333" />
<SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" />
<PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
<HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="White" />
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:AdventureWorksConnectionString %>"
SelectCommand="SELECT FirstName, LastName FROM HumanResources.vEmployee ORDER BY LastName, FirstName">
</asp:SqlDataSource>
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdateProgress ID="UpdateProgress1" runat="server">
<ProgressTemplate>
Getting employees...
</ProgressTemplate>
</asp:UpdateProgress>
</form>
</body>
</html>

 

در C#:

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

protected void GridView1_PageIndexChanged(object sender, EventArgs e)
{
//Include three second delay for example only.
System.Threading.Thread.Sleep(3000);
}
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>

</div>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" CellPadding="4" DataSourceID="SqlDataSource1"
ForeColor="#333333" GridLines="None" OnPageIndexChanged="GridView1_PageIndexChanged">
<FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
<RowStyle BackColor="#FFFBD6" ForeColor="#333333" />
<SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" />
<PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
<HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="White" />
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:AdventureWorksConnectionString %>"
SelectCommand="SELECT FirstName, LastName FROM HumanResources.vEmployee ORDER BY LastName, FirstName">
</asp:SqlDataSource>
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdateProgress ID="UpdateProgress1" runat="server">
<ProgressTemplate>
Getting employees...
</ProgressTemplate>
</asp:UpdateProgress>
</form>
</body>
</html>





تگ ها:

دسته بندی ها: طراحی وب | مقالات آموزشی ASP.NET

ساخت وب سایت با قابلیت آژاکس

ارسال شده توسط administrator
11. أوت 2010 13:34

 

این مقاله چگونگی ایجاد یک Web application با قابلیت AJAX را توضیح می دهد که که می تواند بعنوان یک لیست to-do یا لیست کارها کار کند. این مقاله به شما کمک می کند یک user interface پایه برای ایجاد، مدیریت، و حذف لیست ها و آیتم های موجود در آن لیست ها ایجاد کنید. تمامی عملیاتهای insert، update، delete، sort، و paging درون یک کنترل اجرا می شود که از Microsoft Ajax استفاده می کند.

می توانید از کنترل UpdatePanel برای فعال سازی postbackهای غیرهمزمان روی صفحه استفاده کنید. ASP.NET بطور پیش فرض، هنگام روی دادن یک postback، کل صفحه را refresh می کند. اما، هنگامی که از کنترل UpdatePanel برای ایجاد postbackهای غیر همزمان استفاده می کنید، فقط عنصرهایی که درون کنترل UpdatePanel هستند، تغییر می کنند. این کار باعث می شود صفحه دینامیک تر شود و سرعت بیشتری داشته باشد.

  • taskهای آورده شده در این مقاله شامل موارد زیر است:
  • ایجاد یک بانک اطلاعاتی SQL و اضافه کردن داده ها.
  • اضافه کردن یک کنترل LinqDataSource به صفحه.
  • اضافه کردن یک فایل LINQ to SQL Classes.
  • استفاده از کنترل LinqDataSource برای اتصال به بانک اطلاعاتی با استفاده از LINQ.
  • استفاده از کنترل UpdatePanel برای اضافه کردن قابلیت Ajax به صفحه.

پیش نیازها:

جهت تکمیل مقاله، به نرم افزارهای زیر احتیاج داریم:

  • Microsoft Visual Studio یا Visual Web Developer 2010 Express.
  • SQL Server Express نصب شده روی کامپیوتر.

 

ایجاد یک وب سایت

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

این مقاله از پروژه Web site استفاده می کند. در عوض می توانید از پروژه Web application استفاده می کند.

ایجاد یک file system Web site جدید

  • در Visual Web Developer، در منوی File، روی New Web Site کلیک کنید.
  • پنجره New Web Site نمایش داده می شود.

    زیر Visual Studio installed templates، روی ASP.NET Web Site کلیک کنید.

  • در باکس Location، روی File System کلیک کنید، و نام پوشه ای را که می خواهید صفحات وب سات را در آن نگه دارید، تایپ کنید.
  • در لیست Language، روی Visual Basic یا Visual C# کلیک کنید و سپس OK کنید.

image

Visual Web Developer، پوشه و صفحه ای جدید بنام Default.aspx ایجاد می کند.

 

ایجاد بانک اطلاعاتی جدید در SQL Server

حالا که وب سایتی را ایجاد کرده اید، مرحله بعدی ایجاد بانک اطلاعاتی و یک مرجع به آن در Server Explorer است. (در Visual Web Developer 2008 Express Edition، نام Server Explorer، Database Explorer است.) وقتی یک بانک اطلاعاتی به Server Explorer اضافه می کنید، می توانید از Visual Studio برای اضافه کردن جداول، رویه های ذخیره شده (stored procedure)، viewها، و غیره استفاده کنید. همچنین می توانید داده های جدول را مشاهده کنید یا queryهای خودتان را بطور دستی یا گرافیکی یا با استفاده از پنجره Query Builder، ایجاد کنید.

اضافه کردن بانک اطلاعاتی به پروژه

  • در Solution Explorer، روی نام وب سایت کلیک راست و روی Add New Item کلیک کنید.
  • پنجره Add New Item نمایش داده می شود.

    SQL Database را انتخاب کنید، و نام بانک اطلاعاتی را Tasks.mdf بگذارید، و سپس OK کنید.

  • وقتی Visual Studio  می پرسد آیا بانک اطلاعاتی باید در پوشه App_Data ذخیره شود، YES را کلیک کنید.

 

ایجاد یک Schema و Sample Data برای بانک اطلاعاتی

می توانید از database design و ویژگی های ویرایش برای ایجاد یک schema برای جدول جدید استفاده کنید که آیتم های task را ذخیره می کند.

  • در Solution Explorer، پوشه App_Data را باز منید و روی Tasks.mdf دابل کلیک کنید.
  • نمودار درختی بانک اطلاعاتی taskها در Server Explorer (یا Server Explorer) نمایش داده می شود.

    روی پوشه Tables کلیک راست و سپس روی Add New Table کلیک کنید.

  • در ویرایشگر جدول بانک اطلاعاتی، ستون های زیر را در جدول ایجاد کنید:

 image

  • روی ردیفی که حاوی taskid است، کلیک راست کنید و سپس روی Set Primary Keyکلیک کنید.
  • در حالیکه ردیف taskid هنوز در حالت انتخاب است، در تب Column Properties، بخش Identity Specification را باز کنید و سپس (Is Identity) را روی Yes تنظیم کنید.
  • جدول را ذخیره کنید و نام آنرا TasksList بگذارید.
  • در Server Explorer، روی جدول کلیک راست و روی Show Table Data، کلیک کنید.
  • پنجره ای نمایش داده می شود که می توانید داده ها را مشاهده و اضافه کنید.

    چهاریا پنج رکورد به جدول اضافه کنید، و سپس database designer را ببندید.

مجبور نیستید value برای taskid تعیین کنید، زیرا یک identity column است که value آن بطور اتوماتیک تخصیص داده می شود. باید False یا True بودن فیلد isComplete را مشخص کنید.

 

ایجاد کنترل های Data Access

در این بخش، از کنترل LinqDataSource استفاده می کنیم و کلاس هایی را ایجاد می کنیم که موجودیت های بانک اطلاعاتی (database entities) را نمایش می دهد. کنترل و کلاس ایجاد شده، لایه data-access هستند که در این مقاله مورد استفاده قرار می گیرند.

کنترل LinqDataSource، از طریق معماری کنترل ASP.NET data-source control، LINQ را expose می کند. کنترل LinqDataSource، کد select کردن، update کردن، delete کردن اشیاء بانک اطلاعاتی را ایجاد می کند. LINQ، اصول برنامه نویسی شی گرا را به داده های رابطه ای اعمال می کند. این کنترل مدل برنامه نویسی یکپارچه ای را برای query و update کردن داده ها از انواع مختلف منابع داده ها فراهم می کند و قابلیت های داده ها را مستقیماً به زبان های C# و Visual Basic، اکستند (extend) می کند.

mapping بانک اطلاعاتی Taskها به SQL Data Context Object

جهت شروع ایجاد لایه data access، باید یک typed dataset به پروژه اضافه کنید.

ایجاد کلاسی برای جدول TasksList

  • اگر وب سایت از قبل دارای پوشه App_Code نیست، در Solution Explorer، روی نام وب سایت کلیک راست، و روی Add ASP.NET Folder ، و سپس روی App_Code کلیک کنید.
  • روی پوشه App_Code راست کلیک و سپس روی Add New Item کلیک کنید.
  • زیر Visual Studio installed templates، گزینه LINQ to SQL Classes را انتخاب کنید، و فایل را به Tasks.dbml تغییر نام دهید، و سپس روی Add کلیک کنید.

پنجره Object Relational Designer نمایش داده می شود.

  • در Server Explorer، جدول TasksList را به پنجره Object Relational Designer درگ کنید.
  • فایل Tasks.dbml را ذخیره کنید.

وقتی فایل را ذخیره می کنید، Visual Studio  دو فایل در پوشه App_Code زیر Tasks.dbml ایجاد می کند. فایل اول، Tasks.dbml.layout است؛ و فایل دوم، بسته به زبانی که هنگام ایجاد فایل Tasks.dbml انتخاب کرده اید، Tasks.designer.cs یا Tasks.designer.vb است،.

  • در Solution Explorer، فایل Tasks.designer.cs یا Tasks.designer.vb را باز کنید.

دقت کنید که این کد حاوی کلاس هایی بنام TasksDataContext و TasksList است. کلاس TasksDataContext، نمایانگر بانک اطلاعاتی و کلاس TasksList، نمایانگر جدول بانک اطلاعاتی است. constructor بدون پارامتر کلاس TasksDataContext، کانکشن استرینگ را از فایل Web.config می خواند.

  • فایل Web.config را باز کنید.

دقت کنید که رشته اتصال به بانک اطلاعاتی Tasks.mdf، در عنصر connectionStrings اضافه شده است.

  • فایل کلاس، پنجره Object Relational Designer، و فایل Web.config را ببندید.

 

 

ایجاد و پیکر بندی کنترل LinqDataSource

حالا که یک جدول بانک اطلاعاتی و کلاس هایی دارید که نمایانگر موجودیت های بانک اطلاعاتی هستند، می توانید از کنترل LinqDataSource روی صفحه وب ASP.NET استفاده کنید تا به بانک اطلاعاتی دسترسی پیدا کنید.

  • صفحه Default.aspx را باز کنید.
  • به viewی Design، سوییچ کنید.
  • یک کنترل LinqDataSource روی صفحه درگ کنید.

می تو انید پراپرتی ID را بصورت LinqDataSource1، ترک کنید.

  • در پنل اسمارت تگ LinqDataSource Tasks، روی Configure Data Source کلیک کنید.

 

  image

  • در لیست Choose your context object، گزینه TasksDataContext انتخاب و سپس روی Next. کلیک کنید.
  • در لیست Table، گزینه TasksLists(Table<TasksList>) را انتخاب و سپس روی Finish کلیک کنید.
  • در منوی LinqDataSource Tasks، گزینه های Enable Delete، Enable Insert، و Enable Update را انتخاب کنید.

توجه داشته باشید که مجبور به تعیین هیچ database commands برای select کردن داده ها نیستید.

  • صفحه را ذخیره کنید.

 

 

استفاده از کنترل های Data Source

در این بخش، کنترل هایی را به صفحه ای که از فایل کلاس های LINQ to SQL استفاده می کند، اضافه می کنیم، که جدول بانک اطلاعاتی به کلاس ها را map می کند. همچنین می توانید از کنترل LinqDataSource برای ایجاد data application پایه استفاده کنید.

می توانید یک کنترل ListView جهت نمایش داده ها از بانک اطلاعاتی SQL server، اضافه کنید. سپس می توانید یک کنترل DropDownList برای فیلتر کردن داده های اضافه کنید که در کنترل ListView ظاهر می شوند. در ادامه مقاله، باید کنترل ها را در کنترل UpdatePanel قراردهید تا بتوانید قابلیت های postback غیر همزمان را اضافه کنید.

نمایش داده ها با کنترل ListView

کنترل ListView برای نمایش داده ها در هر ساختار تکرارشونده مفید است، مانند کنترل های DataList و Repeater. اما کنترل ListView، برعکس این کنترل ها، ، عملیات های edit، insert، و delete و همچنین sorting و paging را ساپورت می کند.

می توانید یک کنترل ListView اضافه کنید که همه taskها را نشان می دهد. بعداً، می توانید یک لیست drop-down اضافه کنید که به شما اجازه فیلتر کردن داده ها را می دهد. کنترل ListView، به نمایش داده ها شکل می دهد و دکمه هایی را نشان می دهد که می توانند برای ویرایش و آپدیت کردن محتوا، یا قراردادن (insert) محتویات جدید مورد استفاده قرار گیرند.

اضافه کردن کنترل ListView به صفحه

  • صفحه ای را که کنترل LinqDataSource را اضافه کرده اید، باز کنید.
  • در تب Data در Toolbar، کنترل ListView را روی صفحه درگ کنید.
  • در منوی ListView Tasks، در لیست Choose Data Source، گزینه LinqDataSource1 را انتخاب کنید.
  • این کار، ListView را به کنترل LinqDataSource، که قبلاً پیکربندی کرده اید، بایند (bind) می کند.

  • در پنل اسمارت تگ LinqDataSource Tasks، روی Configure ListView کلیک کنید.
  • در پنجره Configure ListView، گزینه های Enable Editing، Enable Inserting، Enable Deleting، و Enable Paging را انتخاب کنید.
  • روی OK کلیک کنید.
  • صفحه را ذخیره کنید.

 

اضافه کردن کنترل DropDownList جهت فیلتر کردن داده ها

می توانید داده هایی را که در کنترل ListView، از طریق ایجاد یک لیست drop-down نمایش داده می شود، فیلتر کنید - که به شما اجازه می دهد taskهایی را که قرار است نشان دهید، انتخاب کنید. مثلاً می توانید لیستی ایجاد کنید که یا taskهای فعال یا taskهایی را که تکمیل شده اند، نشان می دهد.

می توانید کد را در کنترل ListView قراردهید تا بطور اتوماتیک یک عبارت Where، بمنظور نمایش رکوردهایی که با selection کنترل DropDownList مچ هستند، ایجاد شود.

اضافه کردن یک کنترل جهت فیلتر کردن داده ها

  • صفحه Default.aspx را باز کنید، و به ویووی Source سوییچ کنید.
  • درون عنصر فرم و بالای کنترل ListView، مارک آپ های زیر را دنبال کنید:

 

  • <span id="filter">
    Current List Filter:
    <asp:DropDownList ID="DropDownList1"
    AutoPostBack="true"
    runat="server">
    <asp:ListItem Text="Active" Value="False" />
    <asp:ListItem Text="Completed" Value="True" />
    </asp:DropDownList>
    </span>
    <hr id="separator" />

  • در کنترل LinqDataSource، پراپرتی AutoGenerateWhereClause را روی true تنظیم کنید، همانگونه که در مثلازیر نشان داده شده:
    <asp:LinqDataSource ID="LinqDataSource1" runat="server" 
    ContextTypeName="TasksDataContext"
    TableName="TasksLists"
    EnableDelete="True"
    EnableInsert="True"
    EnableUpdate="True"
    AutoGenerateWhereClause="true" >

  • مارک آپ زیر را به پارامترهای Where، بین تگ های opening و closing کنترل LinqDataSource اضافه کنید.
    <WhereParameters>
    <asp:ControlParameter
    Name="isComplete"
    ControlID="DropDownList1"
    Type="Boolean" />
    </WhereParameters>

  • صفحه را ذخیره کنید.

 

 

حالا می توانید صفحه را تست کنید تا مطمئن شوید داده هایی را که انتخاب کرده اید، نمایش می دهد.

تست کردن صفحه

  • CTRL و F5 را جهت نمایش صفحه در مرورگر فشار دهید.
  • Completed را از لیست drop-down انتخاب کنید.

شما فقط آن taskها را خواهید دید که بصورت complete مارک خورده اند.

 

اضافه کردن قابلیت AJAX به صفحه

در این بخش، جهت فعال کردن ویژگی هایAJAX ، یک کنترل به صفحه اضافه می کنیم. سپس یک کنترل UpdatePanel به صفحه اضافه می کنیم، که اجازه اجرای taskها را در کنترل ListView، بدون postback کامل صفحه، می دهد.

اضافه کردن کنترل ScriptManager

برای استفاده از هر ویژگی ASP.NET AJAX از قبیل کنترل UpdatePanel، باید یک کنترل ScriptManager به صفحه اضافه کنید.

  • 1. صفحه Default.aspx را باز کنید، و به ویووی Source سوییچ کنید.
  • 2. در تب AJAX Extensions در toolbox، روی کنترل ScriptManager راست کنید تا آن را به صفحه درون عنصر فرم اضافه کنید.

قراردادن کنترل ListView درون کنترل UpdatePanel

  • در صفحه Default.aspx، مارک آپ زیر را بلافاصله بعدا از باز کردن تگ <form>اضافه کنید:
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
  • کد زیر را دقیقاً قبل از بستن تگ </form> اضافه کنید:
    </ContentTemplate>
    </asp:UpdatePanel>

این کد، یک کنترل UpdatePanel، اطراف کنترل ListView و کنترل DropDownList قرار می دهد.

  • صفحه را ذخیره کنید.

حالا می توانید دوباره صفحه را تست کنید.

 

تست کردن صفحه

  • CTRL و F5 را جهت نمایش صفحه در مرورگر فشار دهید.

توجه داشته باشید که وقتی Active یا Completed را از list filter انتخاب می کنید، postback کامل اتفاق نمی افتد و کنترل ListView، لیست آپدیت شده ای از داده ها، بدون flicker، را نمایش می دهد.

 

خلاصه

این مقاله چگونگی اضافه کردن ListView به صفحه را با کنترل LinqDataSource، جهت اضافه کردن (add)، اصلاح (modify)، و حذف taskها از بانک اطلاعاتی به شما نشان داد. سپس یاد گرقتید چگونه قابلیت AJAX را با استفاده از کنترل UpdatePanel، اضافه کنید.

تگ ها:

دسته بندی ها: طراحی وب | مقالات آموزشی ASP.NET

آموزش AJAX

ارسال شده توسط administrator
9. أوت 2010 16:28

 

 

وقتی با Ajax یک برنامه می سازید، در واقع تجربه ای گرانبها در اختیار کاربرانتان می گذارید. می توان با استفاده از ویژگی های Ajax و کنترل هایserver-side در ASP.NET، از قبیل کنترل UpdatePanel، برای بهینه سازی server-based ASP.NET Web Forms applications استفاده کرد.

نکته: اگر می خواهید بدون استفاده از کنترل های سرور، Ajax client-side interactivity ایجاد کنید، از jQuery استفاده کنید. در Visual Studio، هنگامی که با استفاده از پراجکت تمپلیت ASP.NET Web Site ، پراجکت تمپلیت ASP.NET Web Application ، و پراجکت تمپلیت ASP.NET MVC 2 Web Application، پروژه ای را ایجاد می کنید، یک لایبرری jQuery در application ایجاد می شود. وقتی با jQuery، دولوپ می کنید، ویژوال استودیو، IntelliSense را، و Microsoft Content Delivery Network، نسخه ای قابل دانلود از لایبرری jQuery را برای نصبی کارآمد، در اختیار می گذارد.

این مقاله، روی بهبود server-based ASP.NET Web Forms applications تمرکز می کند.

چرا از ویژگی های Microsoft Ajax استفاده کنیم؟

Web Forms applicationهایی که از ویژگی های Ajax استفاده می کنند، دارای ویژگی های زیر هستند:

  • عنصرهای اینتراکتیو و آشنای UI، از قبیل progress indicators، tooltips، و پنجره pop-up
  • بازدهی بهبود یافته برای Web Forms application، زیرا قسمت های مهم پردازش صفحه وب را می توان در مرورگر انجام داد.
  • آپدیت های جزیی صفحه که فقط بخش هایی از صفحه وب را refresh می کنند که تغییر یافته اند.
  • client integration با سرویس های برنامه ASP.NET برای اعتبار سنجی فرم ها، سطح دسترسی، و پروفایل های کاربر.
  • کلاس های پروکسی، که بطور اتوماتیک generate میشوند، و متدهای فراخوانی web service را از اسکریپت کلاینت ساده می کنند.
  • قابلیت سفارشی کردن کنترل های سرویس جهت دربر گرفتن قابلیت های کلاینت.
  • ساپورت اکثر مرورگرهای معروف، از قبیل Internet Explorer، Mozilla Firefox، و Apple Safari.

معماری برنامه های Microsoft Ajax

یک برنامه Microsoft Ajax Web، یا از یک solution فقط کلاینت یا از یک solution کلاینت و سرور تشکیل شده است. یک solution فقط کلاینت، از لایبرری Microsoft Ajax استفاده می کند اما از هیچ کنترل سرور ASP.NET استفاده نمی کند. بعنوان مثال، HTML می تواند حاوی عناصر اسکریپت باشد که فایل های Microsoft Ajax Library .js را reference می کنند. لایبرری Microsoft Ajax به برنامه های Ajax اجازه می دهد کل پردازش را روی کلاینت اجرا کند. solution کلاینت و سرور شامل استفاده از هم Microsoft Ajax Library و هم کنترل های سرور ASP.NET است.

شکل زیر، عملکردی را نشان می دهد که در لایبرری های client-script و componentهای سروری که همراه .NET Framework 4 هستند، وجود دارند.

معماری سرور و کلاینت Microsoft Ajax

clip_image001

این شکل، عملکرد لایبرری کلاینت محور Microsoft Ajax را نشان می دهد، که شامل ساپورت ایجاد componentهای کلاینت، سازگاری با مرورگر، و سرویس های networking و هسته ای (Core) می باشد. همچنین این شکل عملکرد ویژگی های Microsoft Ajax سرور محور را نیز نشان می دهد، که شامل ساپورت اسکریپت، سرویس های وب، سرویس های application، و کنترل های سرور است. بخش های بعدی، شکل بالا را با جزییات بیشتر توضیح خواهند داد.

معماری Microsoft Ajax Client

معماری کلاینت، شامل لایبریی هایی برای ساپورت کامپوننت، سازگاری با مرورگر، نتورکینگ، و سرویس های هسته ای است.

کامپوننت ها

کامپوننت های کلاینت، رفتارهای پیشرفته را در مرورگر، بدون postback، فعال می کنند. این کامپوننت ها به سه دسته تقسیم می شوند:

  • Componentها، که اشیای غیر visual هستند که کد را encapsulate می کنند.
  • Behaviorها، که رفتار عنصرهای DOM موجود را گسترش می دهند.
  • Controlها، که یک عنصر DOM جدید ارائه می کنند که دارای رفتار سفارشی است.

نوع کامپوننتی که شما استفاده می کنید، بستگی به نوع رفتار کلاینتی دارد که شما می خواهید. مثلاً، یک watermark برای text box موجود را می توان با استفاده از رفتاری که به text box الصاق می شود، ایجاد کرد.

سازگاری با مرورگر

لایه سازگاری با مرورگر، سازگاری با اکثر مرورگرهای معروف را برای Microsoft Ajax فراهم می کند. این، شما را قادر به نوشتن همان اسکریپ، بدون در نظر گرفتن اینکه کدام مرورگر هدف شماست، می کند.

نتورکینگ

لایه نتورکینگ، ارتباطات بین اسکرپت و سرویس های وب محور بر applicationها را مدیریت می کند. همچنین متد فراخوانی های از راه دور غیر همزمان را نیز مدیریت می کند. در بسیاری از سناریوها، از قبیل آپدیت های جزیی صفحه که از کنترل UpdatePanel استفاده می کنند، لایه نتورکینگ بطور اتوماتیک مورد استفاده قرار می گیرد و نیاز به نوشتن هیچ کدی نیست.

همچنین این لایه، ساپورت دسترسی به اعتبارسنجی فرم های سرور محور، اطلاعات سطح دسترسی، و اطلاعات پروفایل در اسکریپت کلاینت را نیز فراهم می کند. این ساپورت، تا وقتیکه application به لایبرری Microsoft Ajax دسترسی داشته باشد، در Web applicationهایی هم که با استفاده از ASP.NET ایجاد نشده اند نیز قابل دسترسی است.

سرویس های هسته ای

لایبرری های Ajax client-script در ASP.NET، متشکل از فایل های JavaScript (.js) هستند که دارای ویژگی هایی برای توسعه شی گرایی هستند.ویژگی های شی گرایی موجود در لایبرری های Microsoft Ajax client-script، سطج بالایی از سازگاری و پیمانه ای بودن (modularity) را در اسکریپ کردن کلاینت را فعال می کنند. سرویس های هسته ای زیر، بخشی از معماری کلاینت هسند:

  • اکستنشن های شی گرا به JavaScript از قبیل کلاس ها، فضاهای نامی، event handling، وراثت، انواع داده ای، و serialize کردن شی.
  • یک لایبرری کلاس پایه، که حاوی کامپوننت هایی از قبیل string builderها، و مدیریت خطای گسترش یافته است.
  • ساپورت لایبرری های جاواسکریپت، که یا در یک اسمبلی embed می شود یا بصورت فایل های جاواسکریپت مستقل در اختیار گذاشته می شوند. لایبرری های embed شده جاواسکریپت در یک اسمبلی می توانند نصب برنامه را آسان کنند و به حل مسائل versioning کمک می کند.

عیب یابی و مدیریت خطا

سرویس های هسته ای شامل کلاس Sys.Debug است، که متدهایی را برای نمایش اشیا در فرم های قابل خواندن در انتهای صفحه وب فراهم می کند. همچنین این کلاس، trace messageها را نشان می دهد، شما را قادر به استفاده از assortionها می کند، و به شما اجازه شروع debugger را می دهد. شی Error گسترش یافته API، جزییات استثنای مفیدی را با ساپورت مدهای release و debug در اختیار می گذارد.

جهانی سازی (globalization)

سرور Ajax و معماری کلاینت در ASP.NET، مدلی را برای محلی کردن و جهانی کردن اسکریپت کلاینت در اختیار می گذارد.این کار شما را قادر به طراحی برنامه هایی می کند که از پایه کدی واحد برای فراهم کردن UI برای موقعیت های (locale) زیادی (زبان ها و فرهنگ ها) استفاده می کنند. مثلاً، معماری Ajax، کد جاواسکریپت را طبق تنظیمات فرهنگ مرورگر کاربر، بطور اتوماتیک قادر به شکل دهی تاریخ (Date) و اشیای Number می کند، بدون نیاز به postback به سرور.

معماری سرور Ajax

قطعه های از سرور که توسعه Ajax را ساپورت می کند، متشکل از کنترل های سرور ASP.NET Web و کامپوننت هایی است که UI و روال کاری برنامه را مدیریت می کنند. همچنین قطعه های سرور، serialization، validation، و توسعه پذیری کنترل را مدیریت می کند. همچنین سرویس های وبی در ASP.NET وجود دارند که شمتا را قادر به دسترسی به سرویس های برنامه ASP.NET برای اعتبار سنجی فرم ها، سطح دسترسی، و پروفایل کاربران می کند.

ساپورت اسکریپت

ویژگی های Ajax در ASP.NET معمولاً با استفاده از لایبرری های اسکریپت کلاینت که فرآیند را بطور مستقیم روی کلاینت اجرا می کنند، پیاده سازی می شود. همچنین می توانید ویژگی های Ajax را با استفاده از کنترل های سرور که اسکریپت های ارسال شده از سرور به کلاینت را ساپورت می کند، پیاده سازی کنید.

همچنین می توانید اسکریپت کلاینت را برای برنامه های ASP.NETتان سفارشی کنید. در این مورد، همچنین می توانید از ویژگی های Ajax برای مدیریت کردن اسکریپت سفارشی تان بصورت فایل های .js (روی دیسک) یا فایل های .js قرارداده شده در اسمبلی بعنوان resource، استفاده کنید.

ویژگی های Ajax، شامل مدلی برای modeهای release و debug می باشد. مد release، چک کردن و مدیریت خطا (error checking and exception handling) را فراهم می کند که با کمترین اندازه فایل، برای اجرا بهینه سازی شده. مد debug، ویژگی های debugging بهتری از قبیل چک کردن type و argument را در اختیار می گذارد. ASP.NET، ورژن های debug را هنگامی که برنامه در مد debugging است، اجرا می کند. این کار شما را قادر به قرار دادن خطاها در اسکریپت های debug می کند و در عین حال اندازه کد release را به حداقل می رساند.

ساپورت اسکریپت برای Ajax در ASP.NET، جهت فراهم نمودن دو ویژگی زیر بکار می رود:

  • Microsoft Ajax Library، که یک type system و مجموعه ای از اکتنش های جاواسکریپت است که namespaceها، وراثت، اینترفیس، شمارش (enumeration)، refletion، و ویژگی های اضافی را در اختیار می گذارد.
  • رندرینگ جزیی صفحه، که ناحیه هایی از صفحه را با استفاده از یک postback غیرهمزمان، آپدیت می کند.

محلی سازی (localization)

معماری Microsoft Ajax، بر پایه مدل محلی ASP.NET 2.0 ساخته می شود. این موضوع، ساپورت اضافی برای فایل های .js محلی شده فراهم می کند که در یک اسمبلی قرار داده می شوند یا روی دیسک فراهم می شوند. ASP.NET می تواند اسکریپت های کلاینت محلی شده و منبع ها را بطور اتوماتیک برای زبان ها و مناطق ویژه serve کند.

سرویس های وب (Web Services)

با عملکردهای Ajax در یک صفحه ASP.NET، می توانید از اسکریپت کلاینت برای فراخوانی سرویس های وب ASP.NET (.asmx) و هم سرویس های Windows Communication Foundation یا WCF (.svc) استفاده کنید. referenceهای اسکریپت مورد نیاز بطور اتوماتیک به صفحه اضافه می شود، و در عوض کلاس های پروکسی Web service را generate می کند که از اسکریپت کلاینت مورد استفاده قرار می گیرد تا سرویس وب را فراخوانی کند.

سرویس های برنامه (Application Services)

سرویس های برنامه در ASP.NET، سرویس های وبی built-in هستند که بر اساس اعتبار سنجی فرم ها، سطح دسترسی، و پروفایل کاربران در ASP.NET هستند. می توان این سرویس ها را توسط اسکریپت کلاینت در یک صفحه وب با قابلیت Ajax، توسط یک برنامه کلاینت ویندوز، یا توسط یک کلاینت سازگار با WCF فراخوانی کرد.

کنترل های سرور

کنترل های سرور Ajax، متشکل از سرور و کد کلاینتی است که رفتار پیشرفته کلاینت را ایجاد می کند. وقتی کنترلی با قابلیت Ajax را به یک صفحه وب ASP.NET اضافه می کنید، آن صفحه بطور اتوماتیک اسکریپت کلاینت را برای حمایت از عملکرد Ajax به مرورگر می فرستد. می توانید کد کلاینت اضافی را جهت سفارشی کردن عملکرد کنترل فراهم کنید، اما این کار وجب نیست.

لیست زیر، پرکاربردترین کنترل های سرور Ajax را توضیح می دهد:

کنترل

توضیح

ScriptManager

ریسورس های اسکریپت برای کامپوننت ها کلاینت، رندرینگ جزیی صفحه، محلی سازی، جهانی سازی، و اسکریپت های سفارشی کاربر را مدیریت می کند. کنترل ScriptManagerبرای استفاده از UpdatePanel، UpdateProgress، و کنترل های Timer ضروری هستند. اما، کنترل ScriptManage، هنگام ایجاد solution فقط کلاینت، ضروری نیست.

UpdatePanel

به جای refresh کردن کل صفحه با استفاده از یک postback غیر همزمان، شما را قادر به refresh کردن بخش های انتخاب شده صفحه می کند.

UpdateProgress

اطلاعاتی در مورد آپدیت های جزیی صفحه در کنترل های UpdatePanel در اختیار می گذارد.

Timer

postbackهایی را در وقفه های تعریف شده اجرا می کند. می توانید از کنترل Timer برای پست کردن کل صفحه استفاده کنید، یا از آن همراه با کنترل UpdatePanelبرای اجرای آپدیت های جزیی صفحه در وقفه های تعریف شده استفاده کنید.

همچنین می توانید کنترل های سرور سفارشی ASP.NET ایجاد کنید که حاوی رفتارهای کلاینت Ajax است. کنترل های سفارشی ای که قابلیت های کنترل وب های دیگر ASP.NET را بهبود می بخشند، بصورت extendercontrols ارجاع (refer) می شوند.

Ajax Control Toolkit

Ajax Control Toolkit حاوی کنترل هایی است که می توانید برای ساختن برنامه های وب با قابلیت Ajax استفاده کنید. این کنترل ها نیازی به دانش جاواسکریپت یا Ajax ندارند. آنها با استفاده از مفاهیمی طراحی شده اند که برای برنامه نویسان ASP.NET Web Forms application اشنا هستند. با استفاده از Ajax Control Toolkit، می توانید برنامه های ASP.NET Web Forms با قابلیت Ajax و برنامه های وب ASP.NET MVC را با درگ کردن کنترل ها از Toolbox ویژوال استودیوبسازید. Ajax Control Toolkit، یک پروژه open-source است که بخشی از CodePlex Foundation محسوب می شود.

آموزش THEME و SKIN :آموزش گرافیک در ASP.NET

ارسال شده توسط administrator
3. أوت 2010 11:18

 

 

theme، مجموعه ای از تنظیمات پراپرتی است که به شما اجازه می دهد ظاهر صفحات و کنترل ها را تعریف کنید، و آن ظاهر را در صفحات web application، در کل یک web application، یا کل web applicationها روی سرور اعمال کنید.

تم ها و اسکین های کنترل

تم ها از یک سری از عنصرها تشکیل شده اند: اسکین ها، CSS، تصاویر، و منابع دیگر. یک تم حداقل حاوی اسکین ها خواهد بود. تمها در دایرکتوری های ویژه ای در وب سایت یا روی سرور وب شما تعریف می شوند.

اسکین ها

یک فایل اسکین ، دارای اکتنشن .skin و حاوی تنظیمات پراپرتی برای کنترل های منفرد از قبیل Button، Label، Textbox، یا کنترل های Calendar است. تنظیمات Control skin، شبیه control markup هستند، اما فقط حاوی پراپرتی هایی است که می خواهید به عنوان بخشی از تم تنظیم کنید. مثلاً، کد زیر، یک control skin برای کنترل Button است:

<asp:button runat="server" BackColor="lightblue" ForeColor="black" />

 

شما فایل های .skin را در پوشه Theme ایجاد کردید. یک فایل .skin ممکن است حاوی یک یا چند control skin برای یک یا چند control type باشد. می توانید اسکین هایی را در فایلی جدا برای هر کنترل تعریف کنید یا همه اسکین ها را برای یک تم در فایلی واحد تعریف کنید.

دو نوع control skin وجود دارد: اسکین های پیش فرض و اسکین های نام گذاری شده:

  • اسکین پیش فرض: هنگامی که تم به یک صفحه اعمال می شود،بطور اتوماتیک به همه کنترل های یک type، اعمال می شود. یک control skin، یک اسکین پیش فرض است، اگر دارای اتریبیوت SkinID نباشد. مثلاً، اگر یک اسکین پیش فرض برای کنترل Calendar ایجاد کنید، control skin به همه کنترل های Calendar که روی صفحه ای که از تم استفاده می کنند اعمال می شود. (اسکین های پیش فرض، دقیقاً بوسیله control type مچ می شوند، بطوری که اسکین کنترل Button به همه کتنرل های Button اعمال می شود، اما به کنترل های LinkButton یا کنترل هایی که از Button object مشتق می شوند اعمال نمی شود.)
  • اسکین نام گذاری شده: کنترلی با مجموعه پراپرتی های SkinID است. اسکین های نام گذاری شده بطور اتوماتیک به کنتنرل هایی توسط type اعمال نمی شوند. در عوض، اسکین نام گذاری شده را مستقیماً به کنترلی توسط تنظیم پراپرتی SkinID کنترل اعمال می کنید. ایجاد اسکین های نام گذاری شده به شما اجازه می دهند اسکین های مختلفی را برای instanceهای مختلف همان کنترل در یک برنامه تنظیم کنید.

 

CSS

یک تم می تواند حاوی فایل .css نیز باشد. وقتی شما یک فایل .css در پوشه تم قرار می دهید، style sheet بطور اتوماتیک بعنوان بخشی از تم اعمال می شود. شما با استفاده از اکتنشن .css در پوشه تم ، یک style sheet تعریف می کنید.

Theme Graphics و منابع دیگر

همچنین این تم ها ممکن است حاوی graphics و منابع دیگر از قبیل فایل های script، یا فایل های صوتی شود. مثلاً، ممکن است بخشی از تم صفحه شما حاوی یک اسکین برای کنترل TreeView باشد. می توانید graphicهای استفاده شده بمنظور نمایش دکمه expand و دکمه collapse را بعنوان بخشی از تم شامل کنید.

معمولاً فایل های منبع برای تم در همان پوشه ای هستند که فایل های اسکین برای تم وجود دارند، اما می توانند هر جایی در Web application نیز باشند، مثلاً در subfolder پوشه تم .

<asp:Image runat="server" ImageUrl="ThemeSubfolder/filename.ext" />

 

همچنین می توانید فایل های منبع تان را بیرون از پوشه تم نیز ذخیره کنید. اگر از سینتکس tilde (~) برای ارجاع به فایل های منبع استفاده می کنید، Web application بطور اتوماتیک تصاویر را پیدا خواهد کرد. مثلاً اگر منابع یک تم را در یک subfolder برنامه تان قرار دهید، می توانید از مسیرهای فرم ~/SubFolder/filename.ext برای ارجاع به فایل های منبع استفاده کنید، همانطور که در مثال زیر نشان داده شده است.

<asp:Image runat="server" ImageUrl="~/AppSubfolder/filename.ext" />

Scope کردن تم

می توانید تم هایی را برای یک Web applicationواحد، یا بعنوان یک تم جهانی که می تواند توسط همه applicationهای روی Web server استفاده شود، تعریف کنید. بعد از تعریف تم ، می توان آن را با استفاده از اتریبیوت تم یا StyleSheetTheme روی صفحه های مجزا قرار داد، یا می توان با تنظیم عنصر <pages> در پیکر بندی application به همه صفحه های یک application اعمال کنید. اگر عنصر <pages> در فایل Machine.config تعریف شود، تم به همه صفحه ها در Web applicationهای روی سرور اعمال خواهد شد.

تم های صفحه

تم صفحه، یک پوشه تم با control skins، style sheets، فایل های Graphics، و منابع دیگر است که بصورت یک subfolder در پوشه \App_Themes در وب سایت شما ایجاد شده است. هر تم ، یک subfolder متفاوت از پوشه \App_Themes است. مثال زیر، تم یک صفحه معمولی را نشان میدهد، که دو تم بنام های BlueTheme و PinkTheme را تعریف می کند.

MyWebSite
App_Themes
BlueTheme
Controls.skin
BlueTheme.css
PinkTheme
Controls.skin
PinkTheme.css

 

تم های جهانی (global)

تم جهانی، تمی است که می توانید به همه وب سایت های روی سرور اعمال کنید. تم های جهانی به شما اجازه تعریف نمایی کلی برای domain تان، هنگامی که از چندین وب سایت های که روی همان سرور هستند نگهداری می کنید، می دهد.

تم های جهانی، شبیه تم های صفحه هستند که حاوی تنظیمات property، تنظیمات style sheet، و graphic هستند. اما، تم های جهانی در پوشه ای بنام Theme ذخیره می شونده که برای سرور وب، global محسوب می شود. هر وب سایتی روی سرور، و هر صفحه ای در وب سایت، می تواند یک تم جهانی را reference کند.

ارجحیت تنظیمات تم

با تعیین چگونگی اعمال شدن تم، می توانید ارجحیتی را که تنظیمات تم در تنظیمات کنترل محلی می گیرد، مشخص کنید.

اگر پراپرتی تم صفحه را تنضیم کنید، تنظیمات کنترل در تم و صفحه ادغام می شوند تا تنظیمات نهایی برای کنترل را شکل دهند. اگر تنظیمات کنترل هم در کنترل و هم در تم تعریف شوند، تنظیمات کنترل تم هر تنظیمات صفحه ای را روی کنترل override می کند. این استراتژی تم را قادر به ایجاد نمایی ثابت در صفحات می کند، حتی اگر کنترل های روی صفحه از قبل دارای تنظیمات پراپرتی مستقلی باشند. مثلاً، به شما اجازه می دهد تمی را به صفحه ای که در نسخه قبلی ASP.NET ایجاد کرده اید، اعمال کنید.

متناوباً، می توانید تمی را با تنظیم کردن پراپرتی StyleSheetTheme بصورت style sheet اعمال کنید. در این مورد، تنظیمات صفحه محلی، بر تنظیمات تعریف شده در تمی که هنگام تعریف تنظیمات در هر دو جا تعریف شده، ارجحیت دارد. این مدلی است که توسط CSS استفاده می شود. اگر می خواهید حتی هنگامی که تمی را برای نمای کلی اعمال می کنید، قادر به تنظیمات پراپرتی های کنترل های مستقل روی صفحه باشید، ممکن است تمی را بصورت style sheet اعمال کنید.

عنصرهای تم جهانی را نمی توان بصورت جزیی با عنصرهای تم هایی در سطح application جایگزین کرد. اگر تمی در سطح application را هم نام با تم جهانی ایجاد کنید، عناصر تم در تم سطح application، عناصر تم جهانی را override نخواهند کرد.

پراپرتی هایی که می توانید با استفاده از تم ها تعریف کنید

به عنوان یک قانون، می توانید از تم ها برای تعریف پراپرتی هایی استفاده کنید که مربوط به ظاهرصفحه یا کنترل و یا محتویات استاتیک هستند. می توانید فقط پراپرتی هایی را تنظیم کنید که دارای اتریبیوت ThemeableAttribute هستند و در کلاس کنترل روی true تنظیم شده اند.

پراپرتی هایی که بجای ظاهر، رفتار کنترل را تنظیم می کنند، valueهای تم را نمی پذیرند. مثلاً، نمی توانید پراپرتی CommandName کنترل Button را با استفاده از تم تنظیم کنید. بطور مشابه، نمی توانید از تم برای تنظیم پراپرتی AllowPaging کنترل GridView یا پراپرتی DataSource استفاده کنید.

دقت کنید که نمی توانید از عبارت سازها، که عبارات کد را برای تخصیص در صفحه ای هنگام compile کردن، generate می کنند، در تم ها و اسکین ها استفاده کنید.

تم ها در مقابل cascading style sheetها

تم ها در اینکه مجموعه ای از اتریبیوت های رایج را که می توان به هر صفحه ای اعمال کرد تعریف می کنند، شبیه cascading style sheetها هستند. اما، تم ها در موارد زیر با cascading style sheetها فرق دارند:

  • تم ها می توانند پراپرتی های زیاد یک صفحه یا کنترل را تعریف کنند، نه فقط پراپرتی های استایل را. مثلاً، با استفاده از آنها می توانید برای کنترل TreeView، و template layout کنترل GridView، و غیره، گرافیک تعریف کنید.
  • تم ها می توانند حاوی گرافیک باشند.
  • تم ها مانند style sheetها، cascade نمی کنند.
  • بطورپیش فرض، هر valueی پراپرتی تعریف شده در تم که توسط پراپرتی Theme، reference شده است، valueهای پراپرتی را که بطور تعریفی روی کنترل تنظیم شده است، Override می کند، مگر اینکه شما خودتان تم را با استفاد ه از پراپرتی StyleSheetTheme مستقیماً اعمال کنید.
  • فقط یک تم را می توان به هر صفحه اعمال کرد. نمی توانید چندین تم را به یک صفحه اعمال کنید، بر عکس style sheetها که چندین style sheet را می توان اعمال کرد.

 

ملاحظات امنیتی
  • رفتار یک کنترل را طوری تغییر دهید که آنطور که انتظار می رود، رفتار نکند.
  • اسکریپت را در کامپیوتر client تزریق کنید، که منجر به ریسک cross-site scripting می شود.
  • اعتبار سنجی را تغییر دهید.
  • اطلاعات حساس را expose کنید.
  • راههای کاهش این خطرهای رایج عبارتند از:
  • دایرکتوری های جهانی و تم application را با تنظیمات مناسب کنترل access محافظت کنید. فقط باید به کاربرهای مورد اطمینان اجازه نوشتن فایل روی دایرکتوری تم را داد.
  • از تم هایی با منبع غیر قابل اطمینان استفاده کنید. همیشه قبل از استفاده از تم ها در وب سایت تان، تم های خارج از سازمانتان را برای پیدا کردن کدهای خطرناک آزمایش کنید.
  • نام تم را در داده های کوئری، expose نکنید. کاربرهای بدجنس می توانند از این اطلاعات برای استفاده از تم هایی که برای برنامه نویس ناشناس هستند استفاده کنند، و بدینوسیله اطلاعات حساس را expose می کنند.

تگ ها: , ,

دسته بندی ها: طراحی وب | مقالات آموزشی ASP.NET

آموزش تخصصی Ajax

ارسال شده توسط administrator
2. أوت 2010 15:35

 

 

مقدمه

ASP.NET AJAX، که قبلا "atlas" نامیده میشد، پیاده سازی مایکروسافت از قالب کاری بر اساس AJAX است که برای ASP.NET ایجاد شده است (گرچه می تواند در platformهای دیگر نیز مورد استفاده قرار گیرد). AJAX، مخفف عبارت Asynchronous JavaScript and XML است، که گرچه بسیار ساده است، ولی روشی برای انتقال داده ها بین سرور و کلاینت بدون ارسال کل صفحه است، و بدین طریق postback کاملی را ایجاد می کند. این کار به کاربر اجازه تجربه ای بهتر را می دهد، از آنجاییکه بارگذاری محتوای دینامیک را می توان در پشت زمینه بدون refresh یا redraw کردن نیز انجام داد. اگر تا بحال از gmail یا Outlook Web Access استفاده کرده باشید، پس حتما از یک webapplication با قابلیت Ajax استفاده کرده اید؛ بویژه اینکه گوگل Ajax را بسیار معروف کرده است.

در حالیکه استفاده از Ajax، بدون Microsoft ASP.NET AJAX کاملا امکانپذیر است، خیلی چیزها بسیار آسانتر هستند، زیرا مایکروسافت بعضی از کسل کننده ترین بخش های Ajax را در پیاده سازی شان جا داده است. مثلاً، 3 مرورگر معروف به روش های مختلفی برای استفاده از Ajax احتیاج دارند و دارای پیاده سازی های جاواسکریپت مختلفی هستند. ASP.NET AJAX، این کار را بسیار ساده کرده است، و به شما اجازه نوشتن یک کد برای هر سه مرورگر معروف را می دهد.

شروع کار

قبل از هر چیز، باید با ASP.NET آشنایی داشته باشید. اگر شما دارای IDE مناسب باشید، استفاده از ASP.NET AJAX بسیار آسان خواهد شد. توصیه می شود از Visual Web Developer 2008 Express اسنتفاده کنید.

بعد از اینکه آخرین نسخه را نصب کردید، Visual Web Developer 2008 Express را باز کنید، و هنگامی که "New Web Site..." را از منوی File انتخاب کردید، از تمپلیت "ASP.NET website" استفاده کنید.

طبق معمول، از مثال "Hello, world!" به عنوان مثال اول استفاده می کنیم. ابتدا با کد شروع می کنیم و. سپس آن را توضیح خواهیم داد. اگر قبلاً این کار را نکرده اید، باید یک پروژه وب سایت جدید در Visual Web Developer ایجاد کنید. IDE یک فایل جدید Default.aspx و Default.aspx.cs برای شما ایجاد خواهد کرد، که شیه همه صفحات دیگر ASP.NET خواهد بود. بیایید کمی AJAX به آن اضافه کنیم:

<%@ Page Language="C#" AutoEventWireup="true" 
CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Hello, world!</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="MainScriptManager" runat="server" />
<asp:UpdatePanel ID="pnlHelloWorld" runat="server">
<ContentTemplate>
<asp:Label runat="server" ID="lblHelloWorld" Text="Click the button!" />
<br /><br />
<asp:Button runat="server" ID="btnHelloWorld" OnClick="btnHelloWorld_Click" Text="Update label!" />
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>

در CodeBehind، چیز جدیدی غیر از این رویداد که باید اضافه کنید وجود ندارد:

protected void btnHelloWorld_Click(object sender, EventArgs e)
{
lblHelloWorld.Text = "Hello, world - this is a fresh message from ASP.NET AJAX! The time right now is:
"
+ DateTime.Now.ToLongTimeString();
}

در قسمت markup، در مقایسه با ASP.NET معمولی، از دو چیز جدید استفاده می کنیم، کنترل ScriptManager و کنترل UpdatePanel. کنترل ScriptManager چک می کند آیا فایل های ASP.NET AJAX شامل شده اند و اینکه AJAX support اضافه شده است، و باید به هر صفحه ای که دوست دارید از قابلیت AJAX استفاده کنید، اضافه شود. بعد از manager، یکی دیگر از پرکاربردترین کنترل ها هنگام کار با AJAX، کنترل UpdatePanel است. این کنترل به شما اجازه می دهد markupیی را که دوست دارید به طور جزیی آپدیت شود، wrap کنید، بدین معنی که بدون ایجاد یک postback واقعی در سرور، آپدیت شود. توضیحات بیشتر در مورد کنترل UpdatePanel در فصل بعد خواهد آمد. علاوه بر این دو کنترل، هر چیز دیگری، کنترل های استاندارد هستند، بدون هیچ تغییری که رفتار جایگزین را نشان می دهد.

سعی کنید سایت مثال را اجرا کنید، و روی دکمه کلیک کنید. لیبل با متن Hello world، و زمان کنونی آپدیت می شود. به طور مکرر، روی دکمه کلیک کنید، و خواهید دید که لیبل هر دفعه timestamp کنونی را بدست خواهد آورد. به غیبت عجیب پنجره چشمک زن و نوار وضعیت در حال اجرا توجه داشته باشید – هر کاری بدون آپدیت کردن هیچ چیز جز لیبل انجام نمی شود. ما اولین صفحه AJAX را ایجاد کرده ایم. اگر دوست دارید بدانید این صفحه چگونه کار می کند، "enablepartialrendering" کنترل ScriptManager را روی false تنظیم کنید:

<asp:ScriptManager ID="MainScriptManager" runat="server" enablepartialrendering="false" />

این کار جلوی استفاده از rendering جزیی را روی صفحه می گیرد، و به شما نشان می دهد بدون AJAX چگونه کار می کند.

در قسمت بعدی، نگاهی به کنترل های دیگر AJAX و چگونگی استفاده از آنها خواهیم انداخت.

کنترل UpdatePanel

احتمالاً این کنترل، مهم ترین کنترل در بسته ASP.NET AJAX است. این کنترل، اجازه render جزیی ناحیه ای را می دهد. قبلا از آن در مثال Hello world استفاده کردیم، در ادامه نگاهی عمیق تر به جنبه های دیگر این کنترل خواهیم انداخت.

تگ <asp:UpdatePanel> دارای دو زیرتگ (childtags) است: ContentTemplate و Triggers. تگ ContentTemplate ضروری است زیرا دربرگیرنده محتویات پنل است. این محتویات می تواند هر چیزی که معمولاً در صفحه گذاشته می شود، باشد،؛ از متن گرفته تا کنترل های وب. تگ trigger به شما اجازه تعریف بعضی triggerها را می دهد که پنل را وادار به آپدیت کردن محتویاتش می کند. مثال زیر، نحوه استفاد ه از این دو childtag را نشان می دهد.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>UpdatePanel</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel runat="server" id="UpdatePanel" updatemode="Conditional">
<Triggers>
<asp:AsyncPostBackTrigger controlid="UpdateButton2" eventname="Click" />
</Triggers>
<ContentTemplate>
<asp:Label runat="server" id="DateTimeLabel1" />
<asp:Button runat="server" id="UpdateButton1" onclick="UpdateButton_Click" text="Update" />
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel runat="server" id="UpdatePanel1" updatemode="Conditional">
<ContentTemplate>
<asp:Label runat="server" id="DateTimeLabel2" />
<asp:Button runat="server" id="UpdateButton2" onclick="UpdateButton_Click" text="Update" />
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>

در زیر CodeBehind آورده شده است. کافیست متد زیر را به فایل اضافه کنید:

protected void UpdateButton_Click(object sender, EventArgs e)
{
DateTimeLabel1.Text = DateTime.Now.ToString();
DateTimeLabel2.Text = DateTime.Now.ToString();
}

خوب، این مثال چه می خواهد بگوید؟ بیایید امتحانش کنیم، و روی آن دو دکمه کلیک کنیم. متوجه خواهید شد که دکمه اول، فقط datestamp اول را آپدیت می کند، در حالیکه دکمه دوم، هر دو را آپدیت می کند؛ چرا؟ چون ما پنل ها راطوری تنظیم کرده ایم که به طور شرطی آپدیت کنند، بدین معنا که محتویاتشان فقط در صورتی آپدیت می شوند که چیزی درون آنها یک postback ایجاد کند، یا یکی از triggerهای تعریف شده، اجرا شود. همانطور که می بینید، UpdatePanel اول حامل تریگری است که دکمه دوم را reference می کند. این کار تضمین می کند که پنل اول، حتی وقتی هم که کنترلی در UpdatePanel دیگر استفاده می شود، آپدیت می شود. تگ AsyncPostBackTrigger بسیار ساده است- فقط دارای دو صفت (attribute) است؛ یکی controlid که مرجعی به کنترلی است که می تواند آن را trigger کند، و دیگری eventname، که می گوید کدام enettype می تواند باعث اجرا شدن تریگر شود. اگر دوست دارید محتویات یک UpdatePanel آپدیت شوند، می توانید پراپرتی updatemode را به Always تغییر دهید.

در کل، UpdatePanel فقط باید در مناطقی باشد که باشند که دوست دارید آپدیت جزیی را انجام دهید. کل صفحه را در یک UpdatePanel، wrap نکنید، و از استفاده از چندین UpdatePanel نترسید، زیرا این کار به شما امکان کنترل بیشتری روی این می دهد که کدام ناحیه ها چه زمانی آپدیت کنند.

کنترل UpdateProgress

یکی از مشکلات AJAX، این است که چون غیر همزمان و در پیش زمینه است، مرورگر هیچ statusیی به شما نشان نخواهد داد. اما با سرورهای و متدهای سریع، این مشکل زیاد هم بزرگ نیست، اما هروقت شما متدی دارید که زمان زیادی طول می کشد، احتمال دارد کاربر خسته شود. خوشبختانه، ASP.NET AJAX این مشکل را نیز با کنترلی بنام UpdateProgress حل می کند. این کنترل از template خودتان استفاده می کند تا نشان دهد یک متد غیر همزمان در حال کار کردن است. نگاهی به مثال زیر بیاندازید، که کنترلی را که در حال فعالیت است، نشان می دهد.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>UpdateProgress control</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdateProgress runat="server" id="PageUpdateProgress">
<ProgressTemplate>
Loading...
</ProgressTemplate>
</asp:UpdateProgress>
<asp:UpdatePanel runat="server" id="Panel">
<ContentTemplate>
<asp:Button runat="server" id="UpdateButton" onclick="UpdateButton_Click" text="Update" />
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>

متد زیر باید به فایل CodeBehind اضافه شود:

protected void UpdateButton_Click(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(5000);
}

این مثال ساده به شما نشان خواهد داد استفاده از کنترل UpdateProgress چقدر آسان است. وقتی روی این دکمه کلیک می شود، script بمدت پنج ثانیه از standby می شود، و متن "Loading..." روی صفحه تان نمایش داده می شود. می توانید از هر چیزی در ProgressTemplate، شامل markup معمولی و کنترل های دیگر استفاده کنید. یکی از استفاده های رایج، GIF متحرک است، که با استفاده از موقعیت یابی CSS روی صفحه قرار داده شده است.

می توانید روی صفحه کنترل های چندگانه UpdateProgress داشته باشید، و با استفاده از پراپرتی AssociatedUpdatePanelID می توانید مطمئن شوید که UpdateProgress فقط هنگامی نمایش داده می شود که یک UpdatePanel ، آپدیت شده است.

آشنایی با پراپرتی DynamicLayout نیز جالب است. این پراپرتی می گوید آیا یک صفحه باید فضایی را برای کنترل progress رزرو کند یا خیر. اگر روی true تنظیم شود، که پیش فزض است، فضا دینامیک است، پس رزرو نمی شود، اما وقتی کنترل نشان داده می شود، فضا گرفته می شود. اگر دوست دارید فضا را رزر کنید، این پراپرتی را روی false تنضیم کنید. برای دیدن تفاوت، می توانید این پراپرتی را به مثال ما اضافه کنید و آن را تغییر دهید.

اگر تعدادی از postbackها سریع باشند، UpdateProgress، مدتی کوتاه نمایش داده خواهد شد، و منجر به رفتار چشمک زدن خواهد شد، که ممکن است کاربرانتان را گیج کند. به همین دلیل، می توانید حداقل زمان روی دادن را قبل از نشان دادن کنترل progress، تعیین کنید. این کار را می توان با اتریبیوت DisplayAfter انجام داد. باید عددی را بصورت میلی ثانیه تعیین کنید تا قبل از نمایش کنترل progress سپری شود؛ مثلاً اگر دوست دارید دو ثانیه صبر کنید عدد 2000 را تعیین کنید.

کنترل Timer

این کنترل به شما اجازه می دهد pstbackهایی را در بعضی از وقفه ها (interval) انجام دهید. اگر با UpdatePanels استفاده شود، که رایج ترین روش است، به صفحه شما اجازه آپدیت جزیی و زمان بندی شده را می دهد، اما می توان برای postback کردن کل صفحه نیز استفاده کرد. در این بخش، روی استفاده از تایمرهایی با UpdatePanels تمرکز خواهیم کرد.

در زیر مثالی ساده از نحوه استفاده از کنترل Timer آورده شده است که فقط هر پنج ثانیه یکبار timestamp را آپدیت می کند.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Timers</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:Timer runat="server" id="UpdateTimer" interval="5000" ontick="UpdateTimer_Tick" />
<asp:UpdatePanel runat="server" id="TimedPanel" updatemode="Conditional">
<Triggers>
<asp:AsyncPostBackTrigger controlid="UpdateTimer" eventname="Tick" />
</Triggers>
<ContentTemplate>
<asp:Label runat="server" id="DateStampLabel" />
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>

خیلی ساده است. ما یک UpdatePanel نرمال داریم که حامل یک Trigger reference به کنترل timer جدید ماست.

این بدین معناست که هروقت Timer تیک می کند – یعنی رویداد Tick را اجرا می کند – پنل آپدیت می شود. همانطور که در لیست کد CodeBehind می بینید، هر بار که Timer اجرا می شود، DateStampLabelرا اجرا می کنیم. این کار را می توان با JavaScript موثرتر انجام داد، که زمان را روی clientside آپدیت می کند بجای اینکه سرور را درگیر کند. از این مثال فقط برای نشان دادن پتانسیل کنترل Timer استفاده می شود.

روش دیگر، شامل کردن Timer درون است. انجام این کار، ما را از تعریف یک trigger بی نیاز می کند، اما باید بدانید که رفتار، بسته به اینکه آیا Timer درون است یا بیرون آن، متفاوت خواهد بود. وقتی Timer درون UpdatePanel باشد، تا وقتی که UpdatePanel کاملاً آپدیت می شود، Timer دوباره ساخته نمی شود. این بدین معناست که اگر یک تایمری با وقفه شصت ثانیه ای داشته باشیم، و آپدیت پنج ثانیه طول بکشد، رویداد بعدی شصت ثانیه بعد از رویداد قبلی اجرا نمی شود، بلکه شصت و پنج ثانیه بعد اجرا می شود. از سوی دیگر، اگر تایمر خارج از UpdatePanel باشد، کاربر می تواند فقط پنجاه و پنج ثانیه به محتویات پنل نگاه خواهد کرد، قبل از اینکه دوباره آپدیت شود.

همیشه بیاد داشته باشید که گرچه آپدیت های جزیی روی سرور به سنگینی postbackهای واقعی نیستند، اما سرور هنوز contact می شود، و ممکن است هنگام استفاده از تایمرها، ostbackهای جزیی زیادی بدست آورید؛ که می تواند سرعت را کم کند. تا جاییکه می توانید همیشه از وقفه های طولانی استفاده کنید، و دقت کنید آیا contact کردن با سرور واقعاً ضروری است یا خیر.

صفحات اصلی و راهبری سایت

ارسال شده توسط administrator
15. جوييه 2010 13:15

مقدمه

یکی از مشخصه های مشترک سایت های user-friendly این است که دارای نمای یک صفحه در کل صفحات (site-wide page layout) و scheme راهبری هستند. ASP.NET 2.0 دو ویژگی جدید معرفی می کند که پیاده سازی نمای یک صفحه در کل صفحات و scheme راهبری را بسیار ساده می کند: صفحات اصلی و راهبری سایت. صفحات اصلی به برنامه نویسان اجازه ایجاد یک template به پهنای سایت را با ناحیه های تعیین شده و قابل ویرایش می دهد. این template، را می توان صفحات ASP.NET در سایت اعمال نمود. چنین صفحات ASP.NET فقط به داشتن محتوا برای ناحیه های تعیین شده و قابل ویرایش نیاز دارند – همه markupهای دیگر در صفحات اصلی در تمامی صفحات ASP.NET که از صفحه اصلی استفاده می کنند، یکی است. این مدل به برنامه نویسان اجازه تعریف و متمرکز کردن نمای یک صفحه در کل صفحات را می دهد، و بدین ترتیب ایجاد ظاهر و احساسی یکپارچه را در تمامی صفحاتی که براحتی آپدیت می شوند، آسان می کند.

سیستم راهبری سایت (site navigation system) هم مکانیزمی برای برنامه نویسان ایجاد می کند تا نقشه سایت را تعریف کنند و هم یک API برای نقشه سایت که به طور برنامه ریزی شده ای query شود. کنترل های جدید راهبری Web– یعنی Menu، TreeView، و SiteMapPath – render کردن کل یا بخشی از نقشه سایت را در یک عنصر رایج در navigation user interface آسان می کند. ما از site navigation provider پیش فرض استفاده خواهیم کرد، بدین معنی که نقشه سایت ما در فایلی با فرمت XML تعریف می شود.

جهت نشان دادن این سه مفهوم و قابل استفاده کردن tutorialهای وبسایتمان، این مقاله را به تعریف نمای یک صفحه در کل صفحات، پیاده سازی نقشه سایت، و اضافه کردن راهبری UI اختصاص می دهیم.

شکل 1: نتیجه پایانی این مقاله

clip_image001

مرحله اول: ایجاد صفحه اصلی

قدم اول، ایجاد صفحه اصلی سایت است. در حال حاضر سایت فقط ازTyped DataSet (Northwind.xsd، در پوشه App_Code)، کلاس های BLL (ProductsBLL.cs، CategoriesBLL.cs، و غیره در پوشه App_Code )، دیتا بیس (NORTHWND.MDF، در پوشه App_Code )، فایل پیکر بندی (Web.config)، و یک فایل CSS stylesheet (Styles.css) تشکیل شده است.

شکل 2: فایل ها در پروژه ما

clip_image002

برای ایجاد یک صفحه اصلی، روی نام پروژه در Solution Explorer کلیک راست کنید و Add New Item را اضافه کنید. سپس تایپ Master Page را از لیست templateها انتخاب کنیو و نام آن را Site.master بگذارید.

شکل 3: اضافه کردن یک Master Page به وب سایت

clip_image003

site-wide page layout را در صفحه اصلی تعریف کنید. می توانید از viewی Design استفاده کنید و هر Layout یا Web کنترلی که نیاز دارید اضافه کنید، یا می توانید بطور دستی markup را در viewی Source اضافه کنید. من در صفحه اصلی، از styleهایی با تنظیمات CSS که در فایل خارجی Style.css تعریف شده، و cascading style sheetها برای موقعیت یابی (positioning) استفاده می کنم. در حالیکه نمی توان از روی markupیی که در زیر نشان داده شده نمی توان اظهارنظر کرد، قوانین CSS طوری تعریف می شوند که محتویات راهبری <div> کاملاً position می شود، طوری که در سمت چپ ظاهر می شود و دارای پهنای ثابت 200 پیکسل است.

 

Site.master

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Site.master.cs" Inherits="Site" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Working with Data Tutorials</title>
<link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="wrapper">

<form id="form1" runat="server">

<div id="header">
<span class="title">Working with Data Tutorials</span>
<span class="breadcrumb">TODO: Breadcrumb will go here...</span>
</div>

<div id="content">
<asp:contentplaceholder id="MainContent" runat="server">
<!-- Page-specific content will go here... -->
</asp:contentplaceholder>
</div>

<div id="navigation">
TODO: Menu will go here...
</div>
</form>
</div>
</body>
</html>

یک صفحه اصلی، هم page layout استاتیک را تعریف می کند و هم ناحیه هایی را که می توان توسط صفحات ASP.NET که از صفحه اصلی استفاده می کنند، ویرایش کرد. این ناحیه ها، که محتوایشان قابل ویرایش است، توسط کنترل ContentPlaceHolder نشان داده می شوند، و می توان در محتویات <div> مشاهده کرد. صفحه اصلی ما دارای یک ContentPlaceHolder واحد است، اما ممکن است دارای ContentPlaceHolders چندگانه نیز باشد.

با markupیی که در بالا وارد شده، سوییچ کردن به viewی Design، layout صفحه اصلی را نشان می دهد. هر صفحه ASP.NET که ار این master page استفاده می کند، دارای همین layout یک شکل خواهد بود، و قابلیت مشخص کردن markup برای ناحیه MainContent خواهد داشت.

شکل 2: صفحه اصلی، هنگام مشاهده از طریق Design View

clip_image001[4]

مرحله دوم: اضافه کردن یک home page به وب سایت

حالا با صفحه اصلی ای که تعریف کرده ایم، آماده اضافه کردن صفحات ASP.NET به وب سابت هستیم. بیایید با اضافه کردن Default.aspx به home page شروع کنیم. روی نام پروژه در Solution Explorer راست کلیک کنید و Add New Item را انتخاب کنید. آپشن Web Form را از لیست template انتخاب کنید و فایل را نامگذاری کنید. چک باکس "Select master page" را نیز تیک بزنید.

شکل 5: اضافه کردن یک New Web Form، و تیک زدن چک باکس "Select master page"

clip_image002[10]

بعد از OK کردن، برنامه از ما می پرسد این صفحه ASP.NET جدید باید از کدام صفحه اصلی استفاده کند. در حالیکه می توانید چندین master page در پروزه تان داشته باشید، ممکن است شما فقط یکی را انتخاب کنید.

شکل 6: انتخاب صفحه اصلی ای که این صفحه ASP.NET باید استفاده کند

clip_image003[6]

بعد از انتخاب master page، صفحه ASP.NET جدید شامل markup زیر خواهد بود:

Default.aspx

<%@ 
Page Language="C#" MasterPageFile="~/Site.master" 
AutoEventWireup="true" CodeFile="Default.aspx.cs" 
Inherits="_Default" Title="Untitled Page" %>

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

در کد راهنمایی @page، یک reference به فایل صفحه اصلی وجود دارد که مورد استفاده قرار گرفته (MasterPageFile="~/Site.master")، و markup صفحه ASP.NET، شامل یک کنترل Content برای هر یک از کنترل های ContentPlaceHolder است که در صفحه اصلی تعریف شده. کنترل Content جایی است که markupیی را که می خواهید در ContentPlaceHolder متناظر ظاهر شود، قرار می دهید. صفت Title کد راهنمایی @page را روی home تنظیم کنید و یک content خوش آمد گویی به کنترل Content اضافه کنید:

 

Default.aspx

<%@ 
Page Language="C#" MasterPageFile="~/Site.master"
 AutoEventWireup="true" CodeFile="Default.aspx.cs" 
Inherits="_Default" Title="Home" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
<h1>Welcome to the Working with Data Tutorial Site</h1>

<p> This site is being built as part of a set of tutorials that illustrate some of the new data access
and databinding features in ASP.NET 2.0 and Visual Web Developer.</p>

<p>Over time, it will include a host of samples that demonstrate:</p>

<ul>
<li>Building a DAL (data access layer),</li>
<li>Using strongly typed TableAdapters and DataTables</li>
<li>Master-Detail reports</li>
<li>Filtering</li>
<li>Paging,</li>
<li>Two-way databinding,</li>
<li>Editing,</li>
<li>Deleting,</li>
<li>Inserting,</li>
<li>Hierarchical data browsing,</li>
<li>Hierarchical drill-down,</li>
<li>Optimistic concurrency,</li>
<li>And more!</li>
</ul>
</asp:Content>

صفت Titleموجود در کد راهنمای @Page، ب ما اجازه تعیین عنوان صفحه از صفحه ASP.NET را می دهد، گرچه عنصر <title> در صفحه اصلی تعریف می شود. همچنین می توانیم با استفاده از Page.Title ، عنوان را به طور برنامه ریزی شده ای تعیین کنیم. همچنین توجه داشته باشید که referenceهای صفحه اصلی به stylesheetها (از قبیل Style.css) به طور اتوماتیک آپدیت می شوند، طوری که در صفحه ASP.NET کارایی دارند، بدون درنظر گرفتن اینکه صفحه ASP.NET در ارتباط با صفحه اصلی، در کدام دایرکتوری قراردارد.

با سوییچ کردن به viewی Design، می بینیم صفحه اصلی ما در browser چه نمایی دارد. توجه کنید که در

viewی Design برای صفحات ASP.NET ، که فقط ناحیه هایی با محتویات قابل ویرایش، را می توان ویرایش کرد، markup غیر ContentPlaceHolder که در صفحه اصلی تعریف شده، خاکستری رنگ می شود.

شکل 7: Design View برای صفحه ASP.NET، هم نواحی قابل ویرایش را نشان می ده8د هم نواحی غیر قابل ویرایش

clip_image001[6]

وقتی از صفحه Default.aspx بازدید می شود، موتور ASP.NET بطور اتوماتیک محتویات صفحه اصلی را با محتویات ASP.NET ادغام می کند، و محتویات ادغام شده به HTML، را که به browser درخواست کننده ارسال می شود، render می کند. وقتی محتویات صفحه اصلی آپدیت می شود، همه صفحات ASP.NET که از این صفحه اصلی استفاده می کند، دفعه بعد که request می شوند، محتویات شان را با محتویات جدید صفحه اصلی ادغام می کنند. بطور خلاصه، مدل صفحه اصلی به یک page layout template واحد اجازه تعریف شدن را می دهد، و تغییراتش بلافاصله در کل سایت منعکس می شود.

افزودن صفحات ASP.NET اضافی به وب سایت

بیایید نگاهی به چگونگی اضافه کردن stubهای صفحات ASP.NET به سایت بیتدازیم که نهایتا شامل demoهای مختلف گزارش گیری خواهد شد. در مجموع بیش از 35 demo وجود خواهد داشت، پس بجای ایجاد همه صفحات stub، بهتر است فقط چند صفحه ایجاد کنیم. از آنجاییکه categoryهای زیادی از demo نیز وجود خواهد داشت، به منظور مدیریت بهترdemoها، پوشه ای را برای categoryها ایجاد می کنیم. فعلاً سه پوشه زیر را ایجاد می کنیم:

  • BasicReporting
  • Filtering
  • CustomFormatting

نهایتاً، فایل های جدید را Solution Explorer اضافه کنید،همانطور که در شکل 8 نشان داده شده. هنگام اضافه کردن هر فایل، تیک زدن چک باکس "Select master page" را فراموش نکنید.

شکل 8: ایجاد کردن فایل های جدید

clip_image002[12]

مرحله سوم: ایجاد نقشه سایت

یکی از چالش های مدیریت یک وبسایت که از چندین صفحه تشکیل شده است، در اختیار گذاشتن روشی راحت برای کاربران جهت پیمایش (navigate) در سایت است. ابتدا باید ساختار پیمایشی ساخت را تعریف کرد. سپس باید این ساختار را به عناصر user interfaceقابل پیمایش، از قبیل منوها یا breadcrumbها تبدیل کرد. نهایتاً، کل این فرآیند باید مراقبت شوند و هنگامی که صفحات جدید به سایت اضافه می شوند وصفحات قبلی پاک می شوند، آپدیت شوند. قبل از ASP.NET، برنامه نویسان در ایجاد ساختار پیمایشی سایت، مراقبت از آن، و انتقال آن به عناصر user interface قابل پیمایش مختار بودند. اما با ASP.NET، برنامه نویسان می توانند از سیستم راهبری انعطاف پذیر درون سایت استفاده کنند.

سیستم راهبری (یا پیمایش) سایت، ابزاری را را برای تعریف نقشه سایت و سپس دسترسی به این اطلاعات از طریق یک API برنامه ریزی شده در اختیار می گذارد. ASP.NET با یک تهیه کننده نقشه سایت ship می کند که از داده های نقشه سایت انتظار دارد در یک فایل XML ذخیره شود. اما از آنجاییکه سیستم راهبری سایت بر اساس مدل provider ساخته می شود، می توان آنرا برای ساپورت روش های جایگزین serialize کردن اطلاعات نقشه سایت گسترش داد. یک روش برای ایجاد یک site map provider، تهیه نقشه سایت بر اساس ساختار سیستم فایل است.

در این مقاله از site map provider پیش فرض استفاده می کنیم که با ASP.NET 2.0 شیپ (ship) می کند. برای ایجاد نقشه سایت، کافیست روی نام پروژه در Solution Explorer کلیک راست کنید و Add New Item و سپس آپشن Site Map را انتخاب کنید. نامش را Web.sitemap بگذارید و روی دکمه Add کلیک کنید.

شکل 9: اضافه کردن نقشه سایت به پروژه تان

clip_image003[8]

فایل نقشه سایت، یک فایل XML است. توجه داشته باشید که Visual Studio، برای ساختار نقشه سایت، IntelliSense در اختیار می گذارد. فایل نقشه سایت باید دارای نُدِ <siteMap> به عنوان نُدِ (node) اصلی باشد، که باید دقیقاً حاوی یک عنصر فرزند <siteMapNode> باشد. اولین عنصر <siteMapNode> می تواند حاوی شماره ای اختیاری از عناصر فرزندی <siteMapNode> باشد.

نقشه سایت را جهت کپی برداری ساختار سیستم تعریف کنید. بدین ترتیب که، یک عنصر <siteMapNode> برای هر یک از سه پوشه، و عناصر فرزند <siteMapNode> را برای هریک از صفحات ASP.NET در آن پوشه ها اضافه کنید؛ به صورت زیر:

Web.sitemap:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >

<siteMapNode url="~/Default.aspx" title="Home" description="Home">
<siteMapNode title="Basic Reporting" url="~/BasicReporting/Default.aspx"
description="Basic Reporting Samples">
<siteMapNode url="~/BasicReporting/SimpleDisplay.aspx"
title="Simple Display" description="Displays the complete contents of a database table." />
<siteMapNode url="~/BasicReporting/DeclarativeParams.aspx"
title="Declarative Parameters"  description="Displays a subset of the 
contents of a database table using parameters." />
<siteMapNode url="~/BasicReporting/ProgrammaticParams.aspx"
 title="Setting Parameter Values" description="Shows how to set 
parameter values programmatically." />
</siteMapNode>

<siteMapNode title="Filtering Reports" url="~/Filtering/Default.aspx"
description="Samples of Reports that Support Filtering">
<siteMapNode url="~/Filtering/FilterByDropDownList.aspx"
title="Filter by Drop-Down List" description="Filter results using a drop-down list." />
<siteMapNode url="~/Filtering/MasterDetailsDetails.aspx"
title="Master-Details-Details" description="Filter results two levels down." />
<siteMapNode url="~/Filtering/DetailsBySelecting.aspx"
title="Details of Selected Row" description="Show detail results for a selected item in a GridView." />
</siteMapNode>

<siteMapNode title="Customized Formatting" url="~/CustomFormatting/Default.aspx"
description="Samples of Reports Whose Formats are Customized">
<siteMapNode url="~/CustomFormatting/CustomColors.aspx" title="Format Colors"
description="Format the grid&apos;s colors based on the underlying data." />
<siteMapNode url="~/CustomFormatting/GridViewTemplateField.aspx"
title="Custom Content in a GridView" description="Shows using the 
TemplateField to customize the contents of a field in a GridView." />
<siteMapNode url="~/CustomFormatting/DetailsViewTemplateField.aspx"
title="Custom Content in a DetailsView"  
description="Shows using the TemplateField to customize the contents of a field in a DetailsView." />
<siteMapNode url="~/CustomFormatting/FormView.aspx" title="Custom Content in a FormView"
description="Illustrates using a FormView for a highly customized view." />
<siteMapNode url="~/CustomFormatting/SummaryDataInFooter.aspx" title="Summary Data in Footer"
description="Display summary data in the grid's footer." />        
</siteMapNode>

</siteMapNode>

</siteMap>

نقشه سایت، ساختار پیمایشی وب سایت را تعریف می کند، که یک hierarchy است که بخش های مختلف سایت را توصیف می کند. هر عنصر <siteMapNode> در Web.sitemap، نشانگر بخشی در ساختار پیمایشی سایت است.

شکل 10: نقشه سایت، یک ساختار پیمایشی Hierarchical را نشان می دهد

clip_image001[8]

ASP.NET ساختار نقشه سایت را از طریق کلاس SiteMap در .NET Framework اکسپوز (expose) می کند. این کلاس دارای خصوصیت CurrentNode است، که اطلاعات قسمتی را که کاربر در حال حاضر بازدید است بازمی گرداند؛ خصوصیت RootNode، ریشه نقشه سایت را بازمی گرداند. هم خصوصیت CurrentNode هم RootNode نمونه های SiteMapNod را که دارای خصوصیاتی نظیر ParentNode، ChildNodes، NextSibling، PreviousSibling، و غیره است که به سلسله نقشه سایت اجازه می دهد walk شوند.

مرحله چهارم: نمایش یک منو بر اساس نقشه سایت

می توان به داده ها در ASP.NET به طور برنامه ریزی شده دسترسی پیدا کرد. متلاً در ASP.NET 1.x، یا بطور تعریفی از طریق کنترل های منبع جدید داده ها. چندین کنترل درونی برای منبع داده ها از قبیل کنترل SqlDataSource برای دسترسی به داده های بانک اطلاعاتی رابطه ای، کنترل ObjectDataSource برای دسترسی به داده ها از کلاس ها، و غیره وجود دارد. حتی می توانید کنترل های منبع داده های (data source) سفارشی خودتان را نیز ایجاد کنید.

کنترل های منبع داده ها به عنوان یک پروکسی بین صفحه ASP.NET شما و داده های بنیادی عمل می کند. بمنظور نمایش داده های بازیابی شده کنترل منبع داده ها، معمولا کنترل وب دیگری به صفحه اضافه می کنیم و آن را به کنترل منبع داده ها bind می کنیم. برای bind کردن یک کنترل وب به کنترل منبع داده ها؛ کافیست property کنترل DataSourceID را روی مقدار ID property کنترل منبع داده ها تنظیم کنید.

جهت کمک به کارکردن با داده های نقشه سایت، ASP.NET، حاوی کنترل SiteMapDataSource است که به ما اجازه bind کردن کنترل وب در مقابل نقشه سایتمان را می دهد. دو کنتل وب – یعنی TreeView و Menu – معمولاً برای فراهم نمودن یک navigation user interface بکار می روند. جهت bind کردن د اده های نقشه سایت به یکی این دو کنترل، کافیست یک SiteMapDataSource به صفحه، همراه با یک کنترل TreeView یا Menu اضافه کنید، که نتیجتاخصوصیت DataSourceID شان نیز ً تنظیم می شود. مثلاً، می توان با استفاده از markup زیر یک کنترل Menu به صفحه اصلی اضافه نمود:


<div id="navigation">
<asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource1">
</asp:Menu>

<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />
</div>
For a finer degree of control over the emitted HTML, we can
bind the SiteMapDataSource control to the Repeater control, like so:
<div id="navigation">
<ul>
<li><asp:HyperLink runat="server" ID="lnkHome"
NavigateUrl="~/Default.aspx">Home</asp:HyperLink></li>

<asp:Repeater runat="server" ID="menu" DataSourceID="SiteMapDataSource1">
<ItemTemplate>
<li>
<asp:HyperLink runat="server" NavigateUrl='<%# Eval("Url") %>'><%
   1: # Eval("Title") 
%></asp:HyperLink>
</li>
</ItemTemplate>
</asp:Repeater>
</ul>

<asp:SiteMapDataSource ID="SiteMapDataSource1"
runat="server" ShowStartingNode="false" />
</div>

کنترل SiteMapDataSource، سلسله مراتب نقشه سایت را در یک زمان، یک level باز می گرداند، و با node اصلی نقشه سایت شروع می کند (در سایت ما Home)، و سپس level بعدی (Basic Reporting، Filtering Reports، Customized Formatting)، و الی آخر. هنگام bind کردن SiteMapDataSource به یک تکرار کننده (Repeater)، level اول بازگردانده شده را باز می گرداند و ItemTemplate برای هر نمونه از SiteMapNode در level اول را بع عنوان مثال ذکر می کند. برای دسترسی به property معینی از SiteMapNode، می توان از Eval ((propertyName) استفاده کرد که روش دست یابی ما به propertyهای SiteMapNode's Url و Title برای کنترل HyperLink است.

 
<li>
<a href="/Code/BasicReporting/Default.aspx">Basic Reporting</a>
</li>

<li>
<a href="/Code/Filtering/Default.aspx">Filtering Reports</a>
</li>

<li>
<a href="/Code/CustomFormatting/Default.aspx">Customized Formatting</a>
</li>

nodeهای نقشه سایت (Basic Reporting، Filtering Reports، و Customized Formatting)، level دوم از نقشه سایت را که در حال render شدن است، تشکیل می دهد، نه level اول را. دلیلش این است که خصوصیت ShowStartingNode در SiteMapDataSource روی false تنظیم شده است، که باعث می شود SiteMapDataSource، ند اصلی نقشه سایت را bypass کند و در عوض با بازگرداندن level دوم در سلسله مراتب نقشه سایت شروع کند.

جهت نشان دادن زیرگزارش ها برای Basic Reporting، Filtering Reports، و Customized Formatting SiteMapNodes، می توان یک تکرا کننده ((Repeater به تکرار کننده ItemTemplate ابتدایی اضافه کرد. این تکرار کننده تانویه، به خصوصیت ChildNodes نمونه SiteMapNode، بایند (bind) می شود، مانند زیر:

 

<asp:Repeater runat="server" ID="menu" DataSourceID="SiteMapDataSource1">
<ItemTemplate>
<li>
<asp:HyperLink runat="server" NavigateUrl='<%# Eval("Url") %>'><%
   1: # Eval("Title") 
%></asp:HyperLink>

<asp:Repeater runat="server" DataSource='<%# ((SiteMapNode)
Container.DataItem).ChildNodes %>'>
<HeaderTemplate>
<ul>
</HeaderTemplate>

<ItemTemplate>
<li>
<asp:HyperLink runat="server" NavigateUrl='<%# Eval("Url") %>'><%
   1: # Eval("Title") 
%></asp:HyperLink>
</li>
</ItemTemplate>

<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
</li>
</ItemTemplate>
</asp:Repeater>

این دو تکرار کننده، منجر به markup زیر می شوند (بعضی از markupها بمنظور خلاصه شدن، حذف شده اند) :

 
<li>
<a href="/Code/BasicReporting/Default.aspx">Basic Reporting</a>
<ul>
<li>
<a href="/Code/BasicReporting/SimpleDisplay.aspx">Simple Display</a>
</li>
<li>
<a href="/Code/BasicReporting/DeclarativeParams.aspx">Declarative Parameters</a>
</li>
<li>
<a href="/Code/BasicReporting/ProgrammaticParams.aspx">Setting Parameter Values</a>
</li>
</ul>
</li>

<li>
<a href="/Code/Filtering/Default.aspx">Filtering Reports</a>
...
</li>

<li>
<a href="/Code/CustomFormatting/Default.aspx">Customized Formatting</a>
...
</li

با استفاده از styleهای CSS که از کتاب The CSS Anthology: 101 Essential Tips, Tricks, and Hacks نوشته Rachel Andrew انتخاب شده اند، عنصرهای <ul> و <li> طوری style می شوند که markup، منجر به خروجی visual زیر می شود:

شکل 11: منویی تشکیل یافته از از دو تکرار کننده و مقداری CSS

clip_image001[10]

این منو در صفحه اصلی قرا دارد و به نقشه سایتی که در Web.sitemap تعریف شده، bind می شود، بدین معنی که هر تغییری در نقشه سایت بلافاصله در همه صفحاتی که از صفحه اصلی Site.master استفاده می کنند، منعکس می شود.

غیر فعال کردن ViewState

تمامی کنترل های ASP.NET، را می توان روی حالت view stateشان مقاومت کنند، که به صورت یک فیلد فرم مخفی موجود در HTML رندر شده، serialize می شود. View state توسط کنترل هایی استفاده می شوند که حالتشان را که در postbacks، از قبیل داده هایی که به کنترل وب داده ها bind شده، بصورت برنامه ریزی شده ای تغییر می کند، یاد آوری کند. در حالیکه view state، به اطلاعات اجازه می دهد در postbacks یاد آوری شوند، اندازه markupیی را که باید به client ارسال شود را افزایش می دهد، و اگر با دقت monitor نشود، می تواند منجر به bloat شدید صفحه شود. کنترل های Data Web – مخصوصاً GridView – برای اضافه کردن مقادیر زیادی markup به یک صفحه، بسیار نامناسب هستند. در حالیکه چنین افزایشی ممکن است برای broadband یا کاربران intranet کم اهمیت باشد، view state می تواند چندین ثانیه را به round trip برای کاربران dial-up اضافه کند.

جهت درک تاثیر view state، صفحه ای را در مرورگر باز کنید و سپس منبع ارسال شده توسط web page را مشاهده کنید ( درInternet Explorer ، به منوی View بروید و آپشن Source را انتخاب کنید). همچنین می توانید page tracing را روشن کنید تا تخصیص view state را که توسط هریک از کنترل ها روی صفحه استفاده شده است، مشاهده کنید. اصلاعات view state، دریک فیلد فرم مخفی بنام __VIEWSTATE سریالایز می شود، که بلافاصله بعد از باز کردن تگ <form> در عنصر <div> قرار می گیرد. view state فقط هنگامی مقاومت می کند که یک Web Form در حال استفاده شده وجود داشته باشد؛ اگر صفحه ASP.NET شما حاوی <form runat="server"> در syntax تعریف شده نباشد، آنگاه یک فیلد فرم مخفی __VIEWSTATE در markup رندر شده وجود نخواهد داشت.

فیلد فرم VIEWSTATE که توسط صفحه اصلی generate شده است، تقریباً 1800 بایت را به مارک آپ generate شده صفحه اضافه می کند. این bloat اضافی به علت وجود کنترل Repeater است، همانطور که محتوای کنترل SiteMapDataSource برای view state مقاومت می کنند. در حالیکه ممکن است 1800 بایت اضافی زیاد هیجان انگیز بنظر نرسد، اما هنگام استفاده از یک Gridview با فیلدها و رکوردهای زیاد، view state براحتی توسط یک فاکتور 10 یا بیشتر swell می شود.

می توان view state را از طریق تنظیم خصوصیت EnableViewStateروی false، در صفحه یا control level غیر فعلا نمود، و بدین طریق، اندازه مارک آپ رندر شده را کاهش می دهد. از آنجاییکه view state برای کنترل وب داده ها، داده های bind شده به کنترل وب داده ها را در postbacks نگه می دارد، هنگان غیر فعال کردن view state برای یک کنترل وب داده ها، داده ها را باید روی هر postback، بایند کرد. در ASP.NET نسخه 1.x، این مسئولیت به عهده برنامه نویس آن صفحه است، اما در ASP.NET 2.0، اگر نیاز باشد، کنترل های وب داده ها، دوباره به کنترل منبع داده ها روی هر postback بایند می شوند.

جهت کاهش view state صفحه، بیایید خصوصیات EnableViewState کنترل Repeater را روی false تنظیم کنیم. می توان این کار را از طریق پنجره properties در Designer یا بطور تعریفی در Source view انجام داد. بعد از اعمال این تغییر، مارک آپ تعریفی Repeater باید این گونه باشد:

 

 
<asp:Repeater runat="server" ID="menu" DataSourceID="SiteMapDataSource1" 
EnableViewState="False">
<ItemTemplate>
... ItemTemplate contents omitted for brevity ...
</ItemTemplate>
</asp:Repeater>

بعد از این تغییر، اندازه view state رندر شده صفحه به 52 بایت می رسد، کاهشی 97 درصدی در اندازه view state. در این مقاله، من view state کنترل های وب داده ها را بطور پیش فرض غیر فعال می کنم تا اندازه مارک رندر شده را کاهش دهم. در اکثر متال ها، خصوصیت EnableViewState روی false تنظیم می شود و بدون ذکر شدن انجام می شود. تنها زمانی که view state مورد بحث قرار می گیرند، در سناریوهایی است که باید فعال شود تا کنترل وب داده ها عملکرد مورد انتظار را براورده سازند.

مرحله پنجم: اضافه کردن Breadcrumb Navigationclip_image001

جهت تکمیل صفحه اصلی، بیایید یک عنصر UI راهبری breadcrumb به هر صفحه اضافه کنیم. breadcrumb سریعاً موقعیت کنونی کاربر را در سلسله مراتب سایت نشان می دهد. اضافه کردن breadcrumb بسیار آسان است – کافیست یک کنترل SiteMapPath به صفحه اضافه کنید؛ هیچ کدی لازم نیست.

برای سایت خودمان، این کنترل را به هدر <div> اضافه کنید:

 
<span class="breadcrumb">
<asp:SiteMapPath ID="SiteMapPath1" runat="server">
</asp:SiteMapPath>
</span>

breadcrumb، صفحه کنونی ای را که کاربر در سلسله مراتب نقشه سایت در حال مشاهده است نشان می دهد.

شکل 12: Breadcrumb، صفحه کنونی را نشان می دهد

clip_image001[12]

مرحله ششم: اضافه کردن صفحه پیش فرض برای هر بخش

tutorialهای سایت ما به چند بخش مختلف تقسیم می شوند – Basic Reporting، Filtering، و Custom Formatting، و غیره – با یک پوشه برای هر category و tutorialهای معادل در صفحات ASP.NET در آن پوشه. به علاوه، هر پوشه حاوی یک صفحه Default.aspx است. برای این صفحه پیش فرض، بیایید همه tutorialها را برای بخش کنونی نمایش دهیم. بدین معنی که، برای Default.aspx در پوشه BasicReporting لینک هایی به SimpleDisplay.aspx، DeclarativeParams.aspx، و ProgrammaticParams.aspx داریم. در اینجا می توانیم از کلاس SiteMap و یک کنترل وب داده ها یرای نمایش این اطلاعات بر اساس نقشه سایت که در Web.sitemap تعریف شده استفاده کرد.

بیایید لیستی بدون ترتیب را با استفاده از یک Repeater دوباره نشالن دهیم، اما این بار ما عنوان و توصیف tutorialها را نشان می دهیم. از آنجاییکه مارک آپ و کد انجام این کار باید برای هر صفحه Default.aspx تکرار شود، می توانیم این UI logic را در User Control انکپسوله (encapsulate) کرد. پوشه ای بنام UserControls در این وبسایت ایجاد کنید و آنرا به یک آیتم جدید از تایپ User Control بنام SectionLevelTutorialListing.ascx اضافه کنید، و سپس مارک آپ زیر را اضافه کنید:

شکل 13: یک New Web User Control به پوشه UserControls اضافه کنید

clip_image002[14]

SectionLevelTutorialListing.ascx



<%@ Control Language="C#" AutoEventWireup="true" 
CodeFile="SectionLevelTutorialListing.ascx.cs" 
Inherits="UserControls_SectionLevelTutorialListing" %>
<asp:Repeater ID="TutorialList" runat="server" EnableViewState="False">
<HeaderTemplate><ul></HeaderTemplate>
<ItemTemplate>
<li><asp:HyperLink runat="server" NavigateUrl='<%# Eval("Url") %>'
Text='<%# Eval("Title") %>'></asp:HyperLink>
- <%
   1: # Eval("Description") 
%></li>
</ItemTemplate>
<FooterTemplate></ul></FooterTemplate>
</asp:Repeater>

SectionLevelTutorialListing.ascx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class UserControls_SectionLevelTutorialListing :
System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
// If SiteMap.CurrentNode is not null,
// bind CurrentNode's ChildNodes to the GridView
if (SiteMap.CurrentNode != null)
{
TutorialList.DataSource = SiteMap.CurrentNode.ChildNodes;
TutorialList.DataBind();
}
}
}

در مثالRepeater قبلی، ما داده های SiteMap را بطور تعریفی به Repeater بایند کردیم؛ اما کنترل یوزر SectionLevelTutorialListing این کار را به صورت برنامه ریزی شده ای انجام می دهد. در ایونت هندلر Page_Load، چک می شود آیا این بازدید، اولین بازدید از سایت است ( نه یک postback) و آیا URL این صفحه

به یک node در نقشه سایت map می شود. اگر این User Control در صفحه ای که یک مدخل <siteMapNode> متناظر است استفاده شود، SiteMap.CurrentNode به صورت node باز می گردد و هیچ داده ای به Repeater بایند نمی شود. فرض کنیم یک CurrentNode داریم، ما مجموعه ChildNodes هایش را به Repeater بایند می کنیم. از آنجاییکه نقشه سایت ما طوری نصب می شود که صفحه Default.aspx در هر بخش، ند (node) بالایی یا پدر همه tutorialهای موجود در آن بخش است، این کد لینک ها و توصیفات همه tutorialهای آن بخش را نشان خواهدداد، همانگونه که در screen shot زیر نشان داده شده است.

بعد از اینکه این Repeater ایجاد شد، صفحات Default.aspx را در هر پوشه باز کنید، و سپس به viewی Design بروید و فقط فرم User Control را از Solution Explorer به روی Design، یعنی جاییکه می خواهید لیست tutorialها ظاهر شوند، درگ کنید.

شکل 14: User Control به Default.aspx اضافه شده است

clip_image001[14]

شکل 15: Tutorialهای Basic Reporting ایست شده اند

clip_image002[16]

 

خلاصه

با نقشه سایت تعریف شده و master page تکمیل شده، حالا ما دارای یک page layout یکدست و یک navigation scheme برای tutorial]ای مربوط به داده هایمان هستیم. با نادیده گرفتن تعداد صفحاتی که به سایتمان اضافه کرده ایم، آپدیت کردن نمای کلی صفحه یا اطلاعات راهبری سایت، فرآیندی سریع و ساده است؛ زیرا این اطلاعات متمرکز می شوند. مخصوصاً اینکه اطلاعات page layout در Site.master صفحه اصلی و نقشه سایت در Web.sitemap تعریف می شوند. نیاز به نوشتن هیچ کدی برای انجام این site-wide page layout و مکانیزم راهبری نداریم.

 



تگ ها:

دسته بندی ها: مقالات آموزشی ASP.NET