آموزش نکات کاربردی ASP.NET MVC 4 (قسمت پنجم: بخش دوم helperها)

قسمت پنجم :

در این بخش به دو مورد دیگر از کاربرد کتابخانه System.Web.Helpers پرداخته و خواهیم آموخت که چگونه با استفاده از آن، می توان به راحتی به ارسال ایمیل و استفاده از نمودار (Chart) در پروژه های خود پرداخت. ضمنا یادآوری کنم که این بخش در واقع تکمیل پروژه قبلی است و پروژه جدیدی ایجاد نمی کنیم.

ارسال ایمیل

برای ارسال ایمیل از کلاس WebMail استفاده می کنیم؛ روش کار هم ساده است؛ ابتدا دو متد ذیل را به کنترلر HelperController.cs بیافزایید:

public ActionResult SendMail()
{
  return View();
}
[HttpPost]
public ActionResult SendMail2()
{
  try
  {
  var subject = Request["txtSubject"];
  var to = Request["txtTo"];
  var message = Request["txtMessage"];
  WebMail.SmtpServer = "mail.domain.com";
  WebMail.SmtpPort = 25;
  WebMail.EnableSsl = true;
  WebMail.UserName = "username";
  WebMail.Password = "password";
  WebMail.From = "your@email.com";
  WebMail.Send(to: to, subject: subject, body: message);
  ViewBag.Message = "ایمیل فرستاده شد";
  }
  catch (Exception ex)
  {
  ViewBag.Message = "خطا: " + ex.Message;
  }    
  return View("SendMail");
}
بر روی متد اول کلیک راست کرده و با انتخاب Add View... یک View خالی ایجاد کنید؛ سپس کد cshtml ذیل را در آن بنویسید:
@{
  ViewBag.Title = "SendMail";
}
@using (Html.BeginForm("SendMail2", "Helper", FormMethod.Post))
{
  <fieldset style="direction:rtl">
  <legend>فرستادن ایمیل:legend>
   <p>موضوع:<input type="text" name="txtSubject" />p>
   <p>گیرنده:<input type="text" name="txtTo" />p>
   <p><textarea name="txtMessage" cols="45" rows="4">textarea>p>
   <input type="submit" value="فرستادن" />
  fieldset>
  if (IsPost)
  {
   <span>@ViewBag.Messagespan>
  }
}
توضیح: متد اول فقط برای رفتن به صفحه فرستادن ایمیل است؛ اما در متد دوم که کار ارسال ایمیل را انجام می دهد، ابتدا سه متغیر اعلان کردیم که موضوع، گیرنده و متن پیام ایمیل را از TextBoxها می گیرد؛ سپس مشخصات سرور، نام کاربری، رمز عبور و... را مشخص می کنیم (طبق مشخصاتی که هاست شما به شما می دهد)؛ آنگاه با استفاده از متد Send ایمیل را می فرستیم. 
در کدهای cshtml هم یک فرم ساده (مشابه شکل بعد) ایجاد می کنیم که شامل سه تکست باکس است:

بد نیست بدانید شکل کامل متد Send چنین است:
public static void Send(string to, string subject,
 string body,

 string from = null, string cc = null,
 IEnumerable filesToAttach = null,

 bool isBodyHtml = true,

 IEnumerable additionalHeaders = null,
 string bcc = null, string contentEncoding = null,
string headerEncoding = null,

 string priority = null, string replyTo = null);

 

رسم نمودار (Chart)توسط کلاس Chart به راحتی می توان به رسم نمودار پرداخت؛ یک مثال ساده چنین است: 
@{
  ViewBag.Title = "ChartBasic";
}
<h2>ChartBasich2>
@{
  var chart = new Chart(width: 600, height: 400)
    .AddTitle("Students positions:")
    .AddSeries(
    name: "Student",
      xValue: new[] {"Ali", "Mohammad", "Mehdi", "Ahmad", "Hasan"},
      yValues: new[] { "18", "18.50", "19", "16", "17" })
    .Write();
}
در این مثال از دو آرایه برای مقادیر افقی و عمودی استفاده شده است؛ شکل ذیل اجرای آن را نشان می دهد:

البته در متد AddSeries می توان نوع نمودار (Column, Bar, Pie, Stock,...) را نیز مشخص کرد؛ اگر مثال بالا را این گونه تغییر دهید:



.AddSeries( name: "Student", chartType:"Pie", ....
شکل ذیل را خواهید داشت:

سازنده کلاس Chart همچنین می تواند شکل گرافیکی (تم) دلخواه نمودار را تعیین کند؛ خود این کلاس چند تم به رنگ های مختلف دارد؛ همچنین شما می توانید قالب دلخواه خود را داشته باشید. به طور نمونه اگر مثال بالا را این گونه تغییر دهید:
var chart = new Chart(
width: 600, height: 400, theme: ChartTheme.Vanilla3D
)
....
شکل ذیل را خواهید داشت:


رسم نمودار با داده های دیتابیسبه طور معمول در پروژه های خود می خواهیم داده های یک جدول از بانک اطلاعات را به شکل نمودار نشان دهیم؛ کلاس Chart دو متد برای این کار تدارک دیده است: اول: متد DataBindTable برای ایجاد نمودار بر اساس دو فیلد (افقی و عمودی)؛ دوم: متد DataBindCrossTable برای ایجاد نمودار بر اساس سه فیلد (افقی، عمودی و فیلدی برای تعیین گروه بندی).
قبل از هرچیز باید یادآور شوم که من به جدول Students (که در قسمت قبلی این مقاله معرفی کردم) یک فیلد به نام Average اضافه کردم که معدل دانش آموز را نگه می دارد؛ سپس دو کلاس کوچک ذیل را به مدل خود (StudentsDB.cs) اضافه کردم:
public class ChartData
{
  public string FirstName { get; set; }
  public double Average { get; set; }
}
public class ChartData2
{
  public string FirstName { get; set; }
  public DateTime BirthDate { get; set; }
  public double Average { get; set; }
}
شما هم بهتر است این تغییرات را انجام داده پروژه را Build کرده و سپس به ادامه کار بپردازید:
برای استفاده از متد DataBindTable ابتدا متد زیر را به کنترلر خود اضافه کنید:
public ActionResult ChartAdvanced()
{
  var avs = from s in db.Students.Take(6)
     select new ChartData
     {
      FirstName= s.FirstName,
      Average= s.Average
     };
  return View(avs.ToList());
}	
سپس بر روی متد کلیک راست کرده و با انتخاب AddView... یک View ساده به پروژه افزوده و کد cshtml آن را این گونه بنویسید:
@model IEnumerable<MyHelpers.Models.ChartData>
@{
  ViewBag.Title = "ChartAdvanced";
  var chart = new Chart(width: 600, height: 400)
    .AddTitle("معدل")
    .DataBindTable(dataSource: Model, xField: "FirstName")
    .Write();
}
شکل ذیل نتیجه کار را نشان می دهد:

مثال ها کاملا روشن است و نیاز به توضیح نیست؛ فقط یادآور می شوم که متد DataBindTable یک شیء از نوع IEnumerable را به عنوان پارامتر می پذیرد؛ همچنین این متد چون روی دو فیلد کار می کند، فقط کافی است متد افقی (xField) آن را تعیین کرد، فیلد دیگر به طور خودکار داده های عمودی را نشان خواهد داد.
متد DataBindCrossTable نیز مشابه همین است؛ با این تفاوت که شما به یک فیلد اضافی برای گروه بندی نیاز دارید؛ برای استفاده از این متد، ابتدا متد زیر را به کنترلر خود اضافه کنید:
public ActionResult ChartAdvanced2()
{
  var avs = from s in db.Students
  select new ChartData2
  {
    FirstName = s.FirstName,
    BirthDate=s.BirthDate,
    Average = s.Average
  };
  return View(avs.ToList());
}
بر روی متد کلیک راست کرده و با انتخاب AddView... یک ویو به پروژه خود افزوده و کد آن را این گونه اصلاح کنید:
@model IEnumerable<MyHelpers.Models.ChartData2>
@{
  ViewBag.Title = "ChartAdvanced2";
  var chart = new Chart(width: 800, height: 300)
    .AddTitle("معدل ها بر اساس سن")
    .DataBindCrossTable(dataSource: Model,
 groupByField: "FirstName", xField: "BirthDate", yFields: "Average") .Write(); }

شکل ذیل هم نتیجه کار را نشان می دهد:



آموزش نکات کاربردی ASP.NET MVC 4 (قسمت چهارم: بخش اول helperها)

در این سلسله مقالات قصد ندارم آموزش گام به گام MVC را دنبال کنم؛ خوشبختانه منابع خوبی هم به زبان انگلیسی و حتی به زبان فارسی (مانند مقالات آقای امیر مددی در 30sharp.com یا کتاب آموزش کاربردی آموزش کاربردی ASP.NET MVC 2 از آقای مرتضی پورمحمد) وجود دارد که شما می توانید به آن ها مراجعه کنید. من می خواهم به نکات کاربردی و مفید این تکنولوژی که معمولا در طراحی سایت و پروژه ها به آن ها نیاز داریم، بپردازم. اما قبل از هرچیز یادآوری چند نکته را لازم می دانم:

نکته اول: MVC چیست؟در این مورد سخن زیاد گفته شده؛ به طور خلاصه: MVC (مخفف Model-View-Controler) الگوی نوینی از پروژه های ASP.NET است که در آن، بخش های مختلف یک اپلیکشن به خوبی و با یک استاندارد ویژه ساماندهی شده است. همچنین MVC از نسخه 3 به بعد با دستور زبان (syntax) جدید به نام Razer همراه شد که مزایای فراوانی دارد.
برای درک معماری MVC شکل ذیل را ببینید:

همان گونه که شکل می گوید: در معماری MVC کاربر آدرسی (URL) را وارد می کند؛ این تقاضا به یک متد در داخل یک کلاس کنترلر فرستاده می شود (در روش معمول، URL ها به یک فایل html, aspx, php و غیره هدایت شده و سرور آن فایل را پردازش کرده نتیجه را بر می گرداند). سپس کنترلر به کلاس های مدل مراجعه می کند؛ مدل، داده های مورد نیاز را از منبع داده خوانده و به کنترلر تحویل می دهد (یا داده ها را در منبع داده نوشته و نتیجه را بر می گرداند). آنگاه کنترلر، ویو متناسب را به کاربر برمی گرداند.

نکته دوم: آیا حتما باید MVC را انتخاب کنم؟از این سوال طبیعی نباید سرسری گذشت؛ آن گونه که مایکروسافت می گوید، MVC جایگزین ASP.NET کلاسیک نیست؛ بلکه در کنار آن به عنوان راه حل جدید مطرح است. اما کارشناسان معتقدند MVC به خاطر مزایایی (و مزه ای!!!) که دارد، عملا جایگزین آن خواهد شد.
البته در مورد مزایا و معایب MVC نیز سخن فروان است؛ به عقیده من به خاطر:
* سرعت بالاتر نسبت به ASP.NET کلاسیک و صفحات سبک تر (به خاطر حذف ViewState و دیگر بهبودها)
* ساماندهی خوب پروژه و جداسازی قسمت ها و لایه ها (که هم امکان کار گروهی را راحت می کند و هم خود شما هر وقت که لازم باشد، به آسانی بخش های مورد نظر را بازبینی و اصلاح کنید).
* تعامل و درهم آمیختن با تکنولوژی های روز (مانند HTML5, CSS3, Jqury و...)
* دستور زبان Razer که به آسانی با تگهای HTML ترکیب می شود (مشابه PHP)
* و دلایل متعدد دیگر ...
حتما باید با MVC کار کرده و کم کم ASP.NET کلاسیک را فراموش کنید. (هرچند کسانی که مزه MVC را چشیده اند عملا نسبت به آن علاقه و تعصب پیدا می کنند!!)

نکته سوم: برای کار با MVC به چه چیزهایی نیاز دارید؟ابتدا باید نسخه 4 ام وی سی را از آدرس زیر دانلود کرده و نصب کنید
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=27419
طبیعی است که باید Vusual Studio 2010 sp1 یا Visual Studio 11 (نسخه کامل یا Exprees) که به تازگی انتشار یافته است را نصب کرده باشید.
راه دیگر استفاده از WebMatrix است که از سایت asp.net می توانید این پلاتفرم کارا و سبک را به راحتی دانلود کنید. خوشبختانه نسخه 2 این نرم افزار که به تازگی منتشر شده، از Intellecence هم پشتیبانی می کند؛ شکل ذیل را ببینید:

به هر حال، من از نسخه Visual Studio 2010 Express sp1 استفاده می کنم.

نکته چهارم: مروری بر یک پروژه MVC1- ویژوال استودیو را اجرا کرده و یک پروژه جدید از نوع ASP.NET MVC 4 Web Application مانند شکل ذیل انتخاب کرده و نامی دلخواه برای آن انتخاب کنید (شکل ذیل).

2- پس از کلیک بر روی دکمه OK پنجره ذیل را می بینید:

در این شکل چند نکته قابل توجه است: اول این که یک الگوی جدید به نام Mobile Application را مشاهده می کنید که شامل الگویی کم حجم و سازگار با مرورگرهای همراه می باشد (از جمله کتابخانه جدید Jquery Mobile). دوم اینکه باید View engine خود را انتخاب کنید که می تواند Razer یا ASPX باشد. همچنین HTML 5 به صورت پیش فرض انتخاب شده است. با کلیک بر روی دکمه OK ویژوال استودیو پروژه را ایجاد می کند. (شکل ذیل)

همان گونه که در شکل مشاهده می کنید، در یک پروژه MVC علاوه بر پوشه های معمول ASP.NET (مانند Properties, References, App_Data) شامل پوشه های ذیل است:
Content: در این پوشه محتویات غیر دینامیک مورد استفاده در سایت مانند استایل ها، تم ها و... نگهداری می شود.
Controllers: در این پوشه کلاس هایی قرار می گیرد که وظیفه مدیریت برنامه را به عهده می گیرد؛ بدین معنی که در هر کلاس متد یا متدهایی نوشته می شود که به کاربر پاسخ داده، داده ها را از Model می گیرد و View مناسب را به کاربر تحویل می دهد.
Image: برای تصاویر مورد استفاده در اپلیکیشن.
Model: شامل کلاس هایی برای کار با داده ها.
Scripts: شامل فایل های JavaScript که به طور پیش فرض کتابخانه Jquery، Modernizer (پلتفرمی برای مرورگرهایی که از HTML 5 و CSS 3 پشتیبانی نمی کنند) و... می باشد.
Views: شامل نماها که فایل هایی با پسوند cshtml (یا vbhtml) بوده و بخش رابط کاربری (UI) اپلیکیشن را می سازد. برای ساماندهی بهتر نماها، برای هر کلاس به طور معمول یک پوشه جداگانه ایجاد می کنیم. همچنین در این پوشه یک پوشه به نام Shared وجود دارد که شامل اجزای مشترک رابط کاربری مانند Layout (که در ASP.NET کلاسیک MasterPage نامیده می شد).
توجه داشته باشید که یک فایل Web.config در این پوشه نیز وجود دارد که برای تنظیمات نماها و جلوگیری از پردازش فایل های این پوشه توسط IIS است (نماها به طور مستقیم توسط کاربر مورد دسترسی قرار نمی گیرد؛ بلکه توسط کنترلرها پردازش می شود).
اکنون در فایل HomeController.cs (که به طور پیش فرض باز است)، پیامی را همانند ذیل نوشته و برنامه را تست کنید:
public ActionResult Index()
    {
      ViewBag.Message = "This is my first MVC 4 test!";
      return View();
    }

همان گونه که در شکل نیز مشخص است، قالب پیش فرض صفحه در MVC 4 با MVC 3 متفاوت است؛ در این قالب بهبودهایی در THML و CSS افزوده شده و همچنین لینک های Register و Login در صفحات جداگانه باز نمی شود؛ بلکه به صورت یک پنجره Modal نمایان می شود.

در این قسمت به معرفی اجمالی MVC پرداختیم. از قسمت بعدی می خواهیم یک پروژه عملی را برنامه نویسی کنیم تا در خلال آن تمام نکات مورد نیاز برای کار با MVC را فراگیریم. انشاء الله

منبع : http://www.fekrenaw.com


آموزش نکات کاربردی ASP.NET MVC 4 (قسمت سوم)

قبل از ادامه مباحث، از آن جا که صفحات (به تعبیر دقیق تر: Viewها) را با دستور زبان Razer می نویسیم، لازم است نگاهی به آن داشته باشیم. MVC از نسخه 3 به بعد با Razer همراه شد.
دستوراتی که با Razer می نویسیم در فایل هایی با پسوند .cshtml یا .vbhtml ذخیره شده و در واقع همان کدهای سمت سرور است که در شکلی جدید با تگ های HTML ترکیب شده است. اکنون کافی است بجای این که کدهای سمت سرور خود را در بین <%= %> بنویسیم، قبل از آن ها علامت@ بگذاریم.
به طور مثال:

<span>ToDay is: @DateTime.Nowspan>
برای نمونه، دو نمونه Razer و ASP.NET کلاسیک را مقایسه کنید:
ASP.NET:
<% foreach(var item in items) { %>
    <li>Item is: <% item %>.li>
<% } %>

RAZER:
@ foreach(var item in items) { 
    <li>Item is: @ item.li>
 } 
همان گونه که مشاهده می کنید، کدهای Razer بسیار خواناتر و راحت تر است.
شما نباید نگران یادگیری Razer باشید؛ چرا که Razer چیزی جدید نیست و نباید ذهن خود را به آن مشغول کنید! کافی است قبل از کدهای c# یا vb خود از علامت @ استفاده کنید! به همین راحتی.
در این جا برخی از نکات در مورد به کارگیری Razer را مرور می کنیم:
* قبل از کدهای Inline خود علامت @ می گذاریم:
<p>Date is: @DateTime.Now.Datep>
* اگر خود @ را لازم داشته باشید، از دو علامت @@ استفاده می کنیم:
My email is: asif1358@@gmail.com
* دستورات چند سطری را میان @{...} قرار می دهیم:
@{
   var name = " Ali ";
   if(name == "Ali "){
   <p>Hello @name ¡p>
   } else {
   <p>Who is @name ?!!!p>
  }
}
* اگر بخواهیم متن خالص در میان کدهای خود داشته باشیم، قبل از آن، @: قرار داده یا آن را میان تگ ... قرار می دهیم:
@if (showMessage) {
  <text>This is plain texttext>
}

// or:
@if (showMessage) {
  @:This is plain text.
}
* حلقه ها و بلوک های کد نیز به سادگی همانند ذیل می توانند به کار روند:
@{
  <h3>Students:h3> 
  string[] students = {"Ali", "Mohammad", "Mehdi", "Hasan"};
  foreach (var student in students)
  {
    <p>@studentp>
  }
}
* توضیحات در بین @*....*@ قرار می گیرد؛ البته همچنان از // و /*...*/ هم می توانید استفاده کنید:
@{
@*
  A Razor Comment
*@
  //A C# comment
  /* 
    A Multi
     line C# comment
  */
}
* Razer همانند PHP به سادگی با HTML درهم می آمیزد؛ هرجایی که لازم باشد آن را بگذارید:
<a href="Topics/@topicID">...a>
* در قسمت قبلی مشاهده کردید، Master page (که Layout نامیده می شود) با صفحه معمولی چگونه به کار می رود؛ همچنین بد نیست بدانید که در هر قسمت از صفحه که لازم باشد، می توانید از یک
استفاده کنید. بدین صورت که در View خود یک section ایجاد کرده و کدهای خود (کدهای HTML یا سمت سرور( را داخل آن بنویسید:
@section MySectionName {
   <h1>Welcom!h1>
  <img src= ................ />
}
آنگاه در داخل مسترپیج، آن section را در محل مورد نظر بگنجانید:
<div class="test">
   @RenderSection("MySectionName")
div>
شکل ذیل چگونگی به کارگیری section را توضیح می دهد:

همچنین می توانید در داخل یک بلوک if بررسی کنید که آیا چنین section وجود دارد یا خیر:
<footer>
  @if (IsSectionDefined("Footer")) {
    RenderSection("Footer");
  }
  else { 
    <span>This is the default footer.span>   
  }
footer>
تا اینجا آشنایی اجمالی با Razer پیدا کردید؛ در خلال کار، به نکات بیشتر پی خواهید برد؛ اجازه دهید اکنون پروژه خود را تکمیل کنیم:

ادامه پروژهیکی از امکانات بسیار خوب ویژوال استودیو برای پروژه های MVC بهره گیری از scaffolding است که به طور خودکار Viewهای مربوط به نمایش، ایجاد، حذف و ویرایش یک مدل (که معمولا یک جدول بانک اطلاعات است) را ایجاد می کند. این امکان به برنامه نویس اجازه می دهد بدون زحمت کد نویسی، به راحتی با چند کلیک، چندین صفحه از سایت خود را ایجاد کند.
قبل از پی گیری ادامه بحث، خوب است لیبل های فیلدها را برای نمایش صحیح تر اصلاح کنیم (در قسمت قبل در مورد DataAnnotations توضیح دادیم). بدین شکل که قبل از نام فیلد از برچسب [Display(Name=...)] استفاده می کنیم:
[Display(Name = "First and Last name")]
public string FullName { get; set; }
بنا بر این شما می توانید کلاس مربوط به Team را این گونه اصلاح کنید:
public class Team
  {
    [Key]
    public int TeamID { get; set; }

    [Display(Name = "نام تیم")]
    [Required(ErrorMessage = "نام تیم الزامی است")]
    public string TeamName { get; set; }

    [Display(Name = "تاریخ ثبت")]
    [DataType(DataType.Date)]
    public DateTime RegisterDate { get; set; }

    public virtual ICollection Player { get; set; }
  }
به همین ترتیب می توانید کلاس Player را اصلاح کنید.
اکنون بر روی پوشه Controllers کلیک راست کرده و گزینه Add> Contoller... را انتخاب کنید. در پنجره Add Controller، نام آن را TeamController گذاشته و از قسمت Template گزینه Controller with read/write.... را انتخاب کرده و از لیست Model class کلاس Team را برگزیده و بالاخره از قسمت Data context class کلاس PremierLeagDB را انتخاب کنید (شکل ذیل)

بر روی دکمه Add کلیک کنید؛ مشاهده می کنید که علاوه بر ایجاد یک کلاس کنترلر در پوشه Controllers، در پوشه Views یک پوشه به نام Team با چهار View برای ایجاد، نمایش، حذف و ویرایش Teamها ایجاد شده است؛ در واقع به جز فارسی سازی (یکی دو اصلاح کوچک) نیاز به هیچ چیز دیگری نیست؛ صفحات و کدها به طور خود کار اضافه شده اند. 

اکنون پروژه خود را تست کنید؛ به قسمت تیم ها رفته و با کلیک بر روی لینک Create New تیم ها را وارد کنید:

همان گونه که مشاهده می کنید، هم برچسب فیلدها فارسی شده است و هم اعتبارسنجی ها انجام می شود. همچنین با کلیک بر روی لینک های Delete و Edit می توان به حذف و ویرایش تیم پرداخت یا جزئیات یک تیم را با لینک Details مشاهده نمود.
اکنون نگاهی به کلاس TeamController بیاندازید؛ در این کلاس چندین متد برای نمایش و کار با داده ها (کلاس های مدل) ایجاد شده است. به طور نموده متد Index() را در نظر بگیرید:
public ViewResult Index()
{
   return View(db.Teams.ToList());
}
این متد یک View به نام Index بر می گرداند؛ پارامتر این متد، تمام عناصر کلاس Teams از DbContextی که قبلا نوشته بودیم و به لیست تبدیل شده است می باشد. اگر به نمای Index (داخل پوشه Team) نگاه کنید، مشاهده می کنید که در آغاز یک نمونه از آن کلاس (مدل) اعلان شده است:
@model IEnumerable<PremierLeague.Models.Team>
در قسمت HTML هم پس از ایجاد یک table، سطرهای مربوطه توسط یک حلقه foreach افزوده می شود:
@foreach (var item in Model) {
  <tr>
    <td>
      @Html.DisplayFor(modelItem => item.TeamName)
    td>
    <td>
      @Html.DisplayFor(modelItem => item.RegisterDate)
    td>
    <td>
      @Html.ActionLink("Edit", "Edit", new { id=item.TeamID }) |
      @Html.ActionLink("Details", "Details", new { id=item.TeamID }) |
      @Html.ActionLink("Delete", "Delete", new { id=item.TeamID })
    td>
  tr>
}
توجه داشته باشید که در کلاس TeamController دو متد Create()، Edit() و Delete() وجود دارد؛ متد اول خاصیت Get داشته و در واقع کاربر را به صفحه که برای آن عملیات در نظر گرفته شده، هدایت می کند؛ در حقیقت این متد دوم است که اصل عملیات ایجاد، حذف و ویرایش را انجام می دهد.
تمام این متدها کامل اند؛ اما ممکن است بخواهید کد درون آن ها را در داخل بلوک try...catch قرار دهید:
[HttpPost, ActionName("Delete")]
public ActionResult Delete(int id) { 
     try { 
        Team team = db.Teams.Find(id);
        db.Teams.Remove(team);
        db.SaveChanges();
        return RedirectToAction("Index");
   } catch { 
        return View(); 
   } 
}
به همین روش شما باید کنترلر و نماها (View)های مربوط به کلاس Player را نیز ایجاد کنید.
نکته جالب توجه این است که در صفحه ایجاد و ویرایش بازیکن، فیلد TeamID که کلید خارجی است، با یک لیست افتادنی نمایش داده می شود که شما می توانید نام تیم را انتخاب کنید (شکل ذیل)

همین طور اگر در نمای مربوطه، کد Razer را مشاهده کنید، مشابه ذیل خواهد بود:
<div class="editor-label">
   @Html.LabelFor(model => model.TeamID, "Team")
div>
<div class="editor-field">
   @Html.DropDownList("TeamID", String.Empty)
   @Html.ValidationMessageFor(model => model.TeamID)
div>
اکنون مقداری اطلاعات در جدول های Team و Player وارد کنید (داده هایی که ما وارد کرده ایم فقط به عنوان مثال است؛ صحت آن را هیچ بنی بشری تایید نمی کند!!! ضمنا من ابتدا نام ها را به صورت انگلیسی وارد کردم، بعد دیدم بهتر است فارسی کنم. به همین جهت در شکل های قبلی و بعدی ممکن است تفاوت ببینید).

نمایش فیلدها از جدول های مرتبطدر MVC و Entity framework اگر بخواهیم فیلدهای مورد نظر خود را از چند جدول بگیریم، بهتر است ابتدا یک کلاس Entity که حاوی فیلدهای مورد نظر است، ایجاد کنیم؛ سپس با join (و مانند آن) داده ها را در آن قرار داده و نمایش دهیم.
به طور مثال فرض کنید شما سه جدول ذیل را دارید:

در این موارد بهتر است یک کلاس دیگر شامل فیلدهای منتخب سه جدول ایجاد کنید؛ به طور مثال:

حال می توانید در یک کوئری، داده ها را در آن بارگزاری کرده و یا جستجو و فیلتر را انجام دهید؛ به طور مثال:
public ActionResult Index()
{
     try
     {
        var topics = from t in db.Topics
               join s in db.Subjects on t.SubjectID equals s.SubjectID
               join m in db.Members on t.MemberID equals m.MemberID
               select new TopicView
               {
                   ViewID = t.TopicID,
                   SubjectName = s.SubjectName,
                   FLName = m.FLName,
                   Title = t.Title,
                   // Other fields .........
               };
        return View(topics);
      }
    catch (Exception ex)
     {
      return View("Error");
     }
}
بر همین اساس ما می خواهیم لیستی از بازیکنان و تیم مربوط به هر بازیکن را در صفحه اول پروژه خود نمایش داده و امکان جستجو به کاربر بدهیم. پس قبل از هر چیز کلاس ذیل را به مدل خود (PremierLeagueDB.cs) اضافه می کنیم:
public class PlayerView
{
  [Key]
  public int PlayerID { get; set; }
  public string TeamName { get; set; }
  public string FullName { get; set; }
  public int Age { get; set; }
  public DateTime EnrollDate { get; set; }
}
پروژه را Build کرده و مراحل ذیل را انجام دهید: کلاس HomeConroller.cs را باز کرده و فضانام مدل را وارد کنید:
using PremierLeague.Models;
در داخل کلاس یک نمونه از DbContext ایجاد کنید:
PremierLeagueDB db = new PremierLeagueDB();
اکنون متد Index() را این گونه اصلاح کنید:
public ActionResult Index()
{
   var players = from p in db.Players
          join t in db.Teams on p.TeamID equals t.TeamID
          orderby p.PlyerID descending
          select new PlayerView
          {
              PlayerID = p.PlyerID,
              FullName = p.FullName,
              TeamName = t.TeamName,
              Age = p.Age,
              EnrollDate = p.EnrollDate
           };
    return View(players.ToList());
 }
اکنون ابتدا فایل Index.cshtml از پوشه Views>Home را حذف کرده سپس بر روی متد بالا کلیک راست کرده و گزینه Add View... را انتخاب کنید؛ در پنجره Add View از لیست Model class کلاس PlayerView را انتخاب کرده و از قسمت scaffold template گزینه لیست را انتخاب کنید (شکل ذیل)

بر روی دکمه Add کلیک کنید تا نمای Index شامل کدهای مورد نظر (مطابق داده های کلاس PlayerView) ایجاد شود. اکنون اگر پروژه را تست کنید، شکلی مشابه ذیل را خواهید دید (البته من لینک های ویرایش را حذف کرده ام):

افزودن جستجوبدون شک در پروژه های واقعی، نیاز به جستجو در میان داده ها وجود دارد؛ در این ما یک مثال ساده از نحوه به کارگیری آن را در MVC ارائه می کنیم.
بدین منظور ابتدا کد ذیل را قبل از تگ table در نمای Index اضافه کنید:
@using (Html.BeginForm("Index", "Home"))
{ 
  <p>نام بازیکن: @Html.TextBox("name") 
  <input type="submit" value="جستجو" />p> 
}
اکنون در HomeController.cs روایت دیگر از متد Index را (پس از PostBack) این گونه اضافه کنید:
[HttpPost]
public ActionResult Index(string name)
{
     var players = from p in db.Players
           join t in db.Teams on p.TeamID equals t.TeamID
           where p.FullName.Contains(name)
           select new PlayerView
           {
            PlayerID = p.PlyerID,
            FullName = p.FullName,
            TeamName = t.TeamName,
            Age = p.Age,
            EnrollDate = p.EnrollDate
           };
     return View(players.ToList());
}
اکنون می توانید بر اساس نام بازیکن، جستجو انجام دهید (شکل ذیل):


آنچه تا این جا انجام دادیم، مراحل کامل یک پروژه کوچک بود. در بخش های بعدی به مطالب پیشرفته تر مانند نحوه استفاده از ادیتور، ویژگی Display mode برای تنظیم دینامیک صفحه برای مروگرهای معمولی و دستگاه های همراه (که از ویژگی های جدید MVC 4 است)، آژاکس در MVC، استفاده از کتابخانه Microsoft.Web.Helpers (که کار با آپلود فایل، تصاویر، ارسال ایمیل و... ساده می کند) و موارد دیگر را خواهیم آموخت. انشاء الله..

منبع : http://www.fekrenaw.com

.

آموزش نکات کاربردی ASP.NET MVC 4 (قسمت دوم)   

در این قسمت می خواهیم یک وب سایت برای لیگ برتر فوتبال طراحی کنیم!! در خلال کار نکات اصلی MVC را مرور می کنیم. پروژه ای که می خواهیم انجام دهیم مانند شکل ذیل است:

مرحله اول: ایجاد پروژهیک پروژه جدید از نوع ASP.NET MVC 4 Application با نام Premier League (لیگ برتر) ایجاد کنید:

الگوی پروژه را Empty انتخاب کرده و Razer و HTML 5 را انتخاب کنید

مرحله دوم: ایجاد دیتابیسبر روی پوشه App_Data کلیک راست کرده و گزینه Add> New Item را برگزیده و یک بانک اطلاعات SQL Server با نام PremierLeagueDB.mdb به پروژه خود بیافزایید.

در پنجره Database Explorer اتصال مربوط به PremierLeagueDB.mdb را باز کرده بر روی پوشه Tabels کلیک راست کرده و با انتخاب Add New Tabel جدول های مورد نظر را مانند شکل ذیل ایجاد کنید:

البته شما همه استاد بنده هستید و نیاز به توضیح چگونگی ایجاد جدول ندارید؛ اما برای مبتدیانی چون من این توضیح را می دهم: ابتدا هر دو جدول را مطابق شکل بالا ایجاد کرده و سپس ارتباط میان دو جدول را با استفاده از شکل ذیل ایجاد کنید:

بدین صورت که: در حالی که طراح جدول دوم باز است بر روی دکمه Relationship در نوار ابزار کلیک کرده، در پنجره بعدی بر روی دکمه Add کلیک کرده سپس بر روی Tables And Columns Specification کلیک کنید تا دکمه کوچک کنار آن هویدا شده و با کلیک بر روی این دکمه، پنجره بعدی برای تعیین جدول والد و فرزند و نیز تعیین کلید اصلی و خارجی نمایان می شود که مطابق شکل آن را انجام دهید.
مرحله سوم: ایجاد کلاس Entitity Framework برای کار با داده هابرای کار با بانک اطلاعات مذکور، می خواهیم یک کلاس Entitity Framework در پوشه Models ایجاد کنیم؛ برای این کار دو روش وجود دارد:
روش اول استفاده از ویژوال استودیو است؛ بدین منظور بر روی پوشه Models کلیک راست کرده و با انتخاب Add>New Item از قسمت Data یک Entitity Framework با نام PremierLeague.edmx ایجاد کنید (شکل بعد)

در صفحه بعد گزینه From Database را انتخاب کنید؛ در پنجره بعدی برروی دکمه New Connection کلیک کرده و در پنجره بعدی با انتخاب Microsoft SQL Server Database File و کلیک دکمه Browse فایل دیتابیس خود (PremierLeagueDB.mdb) را انتخاب کنید. (البته در این پنجره شما می توانید بانک اطلاعات SQL Server یا با گزینش از دیگر بانک های اطلاعاتی مانند اکسس استفاده کنید). با این کار رشته اتصال ساخته شده و در فایل Web.config ذخیره می شود.

با کلیک دکمه Next به پنجره بعدی رفته و صبر کنید تا لیستی از اشیای دیتابیس نشان داده شود؛ جعبه انتخاب Tables را انتخاب کنید (شکل ذیل)

پس از کلیک بر روی دکمه Finish کلاس های مربوط به جدول های بانک اطلاعات ساخته شده و آماده استفاده است (شکل ذیل):

روش دوم: استفاده از کد نویسی است؛ در این روش با استفاده از کمی کد نویسی می توانیم کلاس های مورد نظر خویش را بنویسیم. از آنجا که این روش کنترل بیشتری به ما می دهد و نیز به خاطر جنبه آموزشی داشتن، ما در اینجا از این روش استفاده می کنیم.
پس بر روی این پوشه کلیک راست کرده و با انتخاب Add> Class یک کلاس با نام PremierLeagueDB.cs ایجاد کنید. در اینجا چند نکته را مد نظر داشته باشید:
اول این که: کلاس شما باید از DbContext مشتق شده باشد (ارث ببرد):

public class PremierLeagueDB : DbContext
{
}
دوم این که: فضانام های ذیل اگر وجود ندارد، به آن بیافزایید:
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
اکنون کلاس مربوط به تیم را این گونه بنویسید:
public class Team
{
   [Key]
   public int TeamID { get; set; }
   public string TeamName { get; set; }
   public DateTime RegisterDate { get; set; }
   public virtual ICollection Player { get; set; }
}
سطر اخیر برای ایجاد ارتباط یک-به-چند میان کلاس Team و Player می باشد.
نکته: برای تایپ سریع تر در ویژوال استودیو، کلمه prop را نوشته و دوبار کلید Tab را فشار دهید.
اکنون کلاس مربوط به بازیکنان را این گونه بنویسید:
public class Player
 {
    [Key]
    public int PlyerID { get; set; }
    public int TeamID { get; set; }
    public string FullName { get; set; }
    public int Age { get; set; }
    public DateTime EnrollDate { get; set; }
    public virtual Team Team { get; set; }
 }
در اینجا نیز سطر اخیر برای ایجاد ارتباط میان دو کلاس است.
حال کلاس PremierLeagueDB خود را اینگونه اصلاح کنید:
public class PremierLeagueDB : DbContext
{
  public DbSet Teams { get; set; }
  public DbSet Players { get; set; }
  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
    modelBuilder.Conventions.Remove();
  }
}
اعتبارسنجی داده ها با Data Annotationsبرای اعتبارسنجی و بررسی صحت داده های ورودی، در MVC از الگوی Data Annotations استفاده می شود. در این روش، هنگام ایجاد یک Property، یک یا چند برچسب Attribute به آن اضافه می کنیم که نشان دهد این فیلد الزامی است و Null نباید باشد، نوع داده و محدوده مقادیر فیلد و دیگر مشخصات آن را کنترل می کنیم. در این جا به چند مورد ضروری اشاره می کنیم:
Required: این برچسب مشخص می کند که فیلد الزامی است و نمی تواند مقدار تهی داشته باشد؛ همچنین می توان یک پیام خطای دلخواه را تعیین کرد. مثال:
[Required(ErrorMessage = "نام تیم الزامی است")]
public string TeamName { get; set; }
StringLength: برای تعیین طول رشته. به طور مثال نام کامل بازیکن نباید از 50 کاراکتر بیشتر باشد:
[StringLength(50, ErrorMessage = "نام بازیکن نباید بیش از 50 کاراکتر باشد")] 
public string FullName { get; set; }
RegularExpression: برای اعتبارسنجی فیلد با استفاده از عبارات با قاعده. به طور مثال می توان صحت ایمیل را این گونه اعتبارسنجی کرد:
[RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}"),
    ErrorMessage = "ایمیل معتبر نیست")]
public string Email { get; set; }
Range: برای تعیین محدوده مقادیر مجاز برای یک فیلد؛ به طور مثال سن بازیکن باید بین 16 تا 38 سال باشد:
[Range(16,38)]
public int Age { get; set; }
DataType: برای تعیین نوع داده فیلد؛ به طور مثال، فیلد تاریخ استخدام بازیکن باید از نوع Date باشد:
[DataType(DataType.Date,ErrorMessage = "فرمت تاریخ صحیح نمی باشد")]
public DateTime EnrollDate { get; set; }
شما می توانید با آنچه آموختید، دو کلاس Team و Player را برای اعتبارسنجی داده های ورودی، اصلاح نمایید.
اکنون بهتر است پروژه خود Build کنید.
مرحله چهارم: ایجاد Controllerهاتا کنون ما کلاس های Model خود را (که به نوعی لایه Data Access است) ایجاد کردیم. این کلاس ها همه نیازهای ما را برای کار با پایگاه داده مان برآورده می کند.
حال می خواهیم کنترلرهای مورد نیاز را ایجاد کنیم. بدین منظور بر روی پوشه Controller کلیک راست کرده و گزینه Add>Controller را انتخاب کرده و در پنجره بعدی نام آن را HomeController گذاشته و Template آن را نیز Empy template انتخاب کنید (در مورد این Templateها بعدا توضیح خواهم داد).

بر روی دکمه Add کلیک کنید تا یک کنترلر که شامل یک متد با نام Index() است، ایجاد شود. کد داخل این کنترلر این گونه است:
public class HomeController : Controller
{
  //
  // GET: /Home/
  public ActionResult Index()
  {
     return View();
  }
}
متدهایی که در کنترلرها می نویسیم، غالبا شیئ از نوع ActionResult بر می گرداند که به برنامه می گوید باید کاری انجام داده و نتیجه را بر گرداند. البته شما می توانید چیزهای دیگری از این متدها بخواهید؛ به طور مثال، متد بالا را این گونه می توانید بنویسید:
public string Index()
{
   return "Hello, Welcome to MVC!";
}
به هر حال، شما فعلا این سطر را قبل از return view() اضافه کنید:
ViewBag.Message = "به سایت لیگ برتر خوش آمدید!";
متد مذکور یک View بر می گرداند که باید آن را ایجاد کنیم؛ بدین منظور بر روی متد Index() کلیک راست کرده و گزینه Add View را انتخاب کنید. در پنجره Add View نام ویو، دستور زبان (که می تواند Razer یا ASPX باشد) و نیز گزینه Use a layout را مشخص می کنید.

در مورد دستور زبان Razer در قسمت بعدی توضیح خواهم داد.
اما Layout در واقع همان MasterPage در صفحات ASP.NET کلاسیک است. بدین معنی که ما قسمت های مشترک صفحات (مانند هیدر، فوتر، منو و...) را در داخل فایل Layout قرار می دهیم. هنگام ایجاد یک پروژه، پوشه ای با نام Shared همراه با یک فایل _Layout.cshtml ایجاد می شود. همچنین در فایل _ViewStrart.cshtml مشخص می کند که Layout پیش فرض، کدام است. بنا بر این لازم نیست در پنجره Add View با کلیک دکمه ... فایل Layout را انتخاب کنید؛ کافی است جعبه انتخاب Use a layout انتخاب شده باشد.
برای فهم بهتر Layout شکل ذیل را نگاه کنید:

به هر حال، با این کار، یک View ساده با نام Index ایجاد می شود. بهتر است برای تست، عبارت 

Index

را با

@ViewBag.Message

جایگزین کنید. این سطر همان پیام را که در کنترلر در متغیر ViewBag.Message ذخیره کرده بودیم، نمایش می دهد.
مرحله پنجم: قالب گرافیک سایتقالب گرافیکی این سایت ساده است؛ مقدار دستورهای css در فایل Site.css که در پوشه Content قرار دارد، نوشته ایم؛ شما می توانید قالب دلخواه خود را طراحی کنید؛ دستوراتی که من نوشته ام این گونه است:
body
{
  padding: 0;
  margin: 0;
  direction: rtl;
  background-color: #e6e7e9;
  font-family: Tahoma;
  font-size: 10pt;
  line-height: 100%;
}
/* Styles for main DIV  --------------------------- */
.main
{
  width: 800px;
  margin: 0 auto;
  margin-top: 20px;
  margin-bottom: 20px;
  border-radius: 10px;
  background: #ffffff;
  border: 1px solid #b4bbc3;
}
/* Styles for HEADER --------------------------- */
.header
{
  background: #d4d7df;
  padding: 10px;
  border-radius: 9px 9px 0 0;
}
/* Styles for MENU  ---------------------------*/
.menubg
{
  border-top: 1px solid #646777;
  border-bottom: 1px solid #646777;
}
.menu
{
  width: 800px;
  height: 20px;
  margin: 0;
  padding: 0;
  background: #646777;
  border-top: 1px solid #ffffff;
  border-bottom: 1px solid #ffffff;
  list-style: none;
  display: block;
}
.menu li
{
  float: right;
  border-left: 1px solid #336666;
  padding: 3px 0px;
}
.menu li a
{
  padding: 3px 16px;
  border-left: 1px solid #dddddd;
  color: #d4d7df;
  text-decoration: none;
}
.menu li a:hover
{
  background-color: #000033;
}
/* Styles for CONTENT DIV --------------------------- */
.content
{
  padding: 20px;
}
/* Styles for TABLE (CSS3) --------------------------- */
th
{
  font-weight: bold;
  background-color: #dadada;
}
div.AltRow
{
  border:1px solid #dadada;
}
div.AltRow tr:nth-child(odd)
{
  background-color: #ffffff;
}
div.AltRow tr:nth-child(even)
{
  background-color: #efefef;
}
div.AltRow tr:hover
{
  background-color: #dadada;
}
/* Styles for validation helpers  ---------------------------*/
.field-validation-error
{
  color: #ff0000;
}
.field-validation-valid
{
  display: none;
}
.input-validation-error
{
  border: 1px solid #ff0000;
  background-color: #ffeeee;
}
.validation-summary-errors
{
  font-weight: bold;
  color: #ff0000;
}
.validation-summary-valid
{
  display: none;
}
اکنون فایل _Layout.cshtml را باز کرده و آن را مشابه ذیل اصلاح کنید:
  
  
  
  
  
  


  


این کد، شامل کدهای HTML و مقداری کد Razer است که در بخش بعدی به آن می پردازیم. انشاء الله.
تا اینجای کار قدم های اولیه را برداشته ایم و پروژه ما آماده است برای کار با داده ها و بانک اطلاعات. بد نیست پروژه را تست کنید تا شکل مشابه ذیل را مشاهده کنید:

آموزش نکات کاربردی ASP.NET MVC 4 (قسمت اول)

آموزش نکات کاربردی ASP.NET MVC 4 (قسمت اول)در این سلسله مقالات قصد ندارم آموزش گام به گام MVC را دنبال کنم؛ خوشبختانه منابع خوبی هم به زبان انگلیسی و حتی به زبان فارسی (مانند مقالات آقای امیر مددی در 30sharp.com یا کتاب آموزش کاربردی آموزش کاربردی ASP.NET MVC 2 از آقای مرتضی پورمحمد) وجود دارد که شما می توانید به آن ها مراجعه کنید. من می خواهم به نکات کاربردی و مفید این تکنولوژی که معمولا در طراحی سایت و پروژه ها به آن ها نیاز داریم، بپردازم. اما قبل از هرچیز یادآوری چند نکته را لازم می دانم:

نکته اول: MVC چیست؟در این مورد سخن زیاد گفته شده؛ به طور خلاصه: MVC (مخفف Model-View-Controler) الگوی نوینی از پروژه های ASP.NET است که در آن، بخش های مختلف یک اپلیکشن به خوبی و با یک استاندارد ویژه ساماندهی شده است. همچنین MVC از نسخه 3 به بعد با دستور زبان (syntax) جدید به نام Razer همراه شد که مزایای فراوانی دارد.
برای درک معماری MVC شکل ذیل را ببینید:

همان گونه که شکل می گوید: در معماری MVC کاربر آدرسی (URL) را وارد می کند؛ این تقاضا به یک متد در داخل یک کلاس کنترلر فرستاده می شود (در روش معمول، URL ها به یک فایل html, aspx, php و غیره هدایت شده و سرور آن فایل را پردازش کرده نتیجه را بر می گرداند). سپس کنترلر به کلاس های مدل مراجعه می کند؛ مدل، داده های مورد نیاز را از منبع داده خوانده و به کنترلر تحویل می دهد (یا داده ها را در منبع داده نوشته و نتیجه را بر می گرداند). آنگاه کنترلر، ویو متناسب را به کاربر برمی گرداند.

نکته دوم: آیا حتما باید MVC را انتخاب کنم؟از این سوال طبیعی نباید سرسری گذشت؛ آن گونه که مایکروسافت می گوید، MVC جایگزین ASP.NET کلاسیک نیست؛ بلکه در کنار آن به عنوان راه حل جدید مطرح است. اما کارشناسان معتقدند MVC به خاطر مزایایی (و مزه ای!!!) که دارد، عملا جایگزین آن خواهد شد.
البته در مورد مزایا و معایب MVC نیز سخن فروان است؛ به عقیده من به خاطر:
* سرعت بالاتر نسبت به ASP.NET کلاسیک و صفحات سبک تر (به خاطر حذف ViewState و دیگر بهبودها)
* ساماندهی خوب پروژه و جداسازی قسمت ها و لایه ها (که هم امکان کار گروهی را راحت می کند و هم خود شما هر وقت که لازم باشد، به آسانی بخش های مورد نظر را بازبینی و اصلاح کنید).
* تعامل و درهم آمیختن با تکنولوژی های روز (مانند HTML5, CSS3, Jqury و...)
* دستور زبان Razer که به آسانی با تگهای HTML ترکیب می شود (مشابه PHP)
* و دلایل متعدد دیگر ...
حتما باید با MVC کار کرده و کم کم ASP.NET کلاسیک را فراموش کنید. (هرچند کسانی که مزه MVC را چشیده اند عملا نسبت به آن علاقه و تعصب پیدا می کنند!!)

نکته سوم: برای کار با MVC به چه چیزهایی نیاز دارید؟ابتدا باید نسخه 4 ام وی سی را از آدرس زیر دانلود کرده و نصب کنید
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=27419
طبیعی است که باید Vusual Studio 2010 sp1 یا Visual Studio 11 (نسخه کامل یا Exprees) که به تازگی انتشار یافته است را نصب کرده باشید.
راه دیگر استفاده از WebMatrix است که از سایت asp.net می توانید این پلاتفرم کارا و سبک را به راحتی دانلود کنید. خوشبختانه نسخه 2 این نرم افزار که به تازگی منتشر شده، از Intellecence هم پشتیبانی می کند؛ شکل ذیل را ببینید:

به هر حال، من از نسخه Visual Studio 2010 Express sp1 استفاده می کنم.

نکته چهارم: مروری بر یک پروژه MVC1- ویژوال استودیو را اجرا کرده و یک پروژه جدید از نوع ASP.NET MVC 4 Web Application مانند شکل ذیل انتخاب کرده و نامی دلخواه برای آن انتخاب کنید (شکل ذیل).

2- پس از کلیک بر روی دکمه OK پنجره ذیل را می بینید:

در این شکل چند نکته قابل توجه است: اول این که یک الگوی جدید به نام Mobile Application را مشاهده می کنید که شامل الگویی کم حجم و سازگار با مرورگرهای همراه می باشد (از جمله کتابخانه جدید Jquery Mobile). دوم اینکه باید View engine خود را انتخاب کنید که می تواند Razer یا ASPX باشد. همچنین HTML 5 به صورت پیش فرض انتخاب شده است. با کلیک بر روی دکمه OK ویژوال استودیو پروژه را ایجاد می کند. (شکل ذیل)

همان گونه که در شکل مشاهده می کنید، در یک پروژه MVC علاوه بر پوشه های معمول ASP.NET (مانند Properties, References, App_Data) شامل پوشه های ذیل است:
Content: در این پوشه محتویات غیر دینامیک مورد استفاده در سایت مانند استایل ها، تم ها و... نگهداری می شود.
Controllers: در این پوشه کلاس هایی قرار می گیرد که وظیفه مدیریت برنامه را به عهده می گیرد؛ بدین معنی که در هر کلاس متد یا متدهایی نوشته می شود که به کاربر پاسخ داده، داده ها را از Model می گیرد و View مناسب را به کاربر تحویل می دهد.
Image: برای تصاویر مورد استفاده در اپلیکیشن.
Model: شامل کلاس هایی برای کار با داده ها.
Scripts: شامل فایل های JavaScript که به طور پیش فرض کتابخانه Jquery، Modernizer (پلتفرمی برای مرورگرهایی که از HTML 5 و CSS 3 پشتیبانی نمی کنند) و... می باشد.
Views: شامل نماها که فایل هایی با پسوند cshtml (یا vbhtml) بوده و بخش رابط کاربری (UI) اپلیکیشن را می سازد. برای ساماندهی بهتر نماها، برای هر کلاس به طور معمول یک پوشه جداگانه ایجاد می کنیم. همچنین در این پوشه یک پوشه به نام Shared وجود دارد که شامل اجزای مشترک رابط کاربری مانند Layout (که در ASP.NET کلاسیک MasterPage نامیده می شد).
توجه داشته باشید که یک فایل Web.config در این پوشه نیز وجود دارد که برای تنظیمات نماها و جلوگیری از پردازش فایل های این پوشه توسط IIS است (نماها به طور مستقیم توسط کاربر مورد دسترسی قرار نمی گیرد؛ بلکه توسط کنترلرها پردازش می شود).
اکنون در فایل HomeController.cs (که به طور پیش فرض باز است)، پیامی را همانند ذیل نوشته و برنامه را تست کنید:
public ActionResult Index()
    {
      ViewBag.Message = "This is my first MVC 4 test!";
      return View();
    }

همان گونه که در شکل نیز مشخص است، قالب پیش فرض صفحه در MVC 4 با MVC 3 متفاوت است؛ در این قالب بهبودهایی در THML و CSS افزوده شده و همچنین لینک های Register و Login در صفحات جداگانه باز نمی شود؛ بلکه به صورت یک پنجره Modal نمایان می شود.
در این قسمت به معرفی اجمالی MVC پرداختیم. از قسمت بعدی می خواهیم یک پروژه عملی را برنامه نویسی کنیم تا در خلال آن تمام نکات مورد نیاز برای کار با MVC را فراگیریم. انشاء الله

منبع : فکرنو داتکام

آموزش LINQ to Object

همانطور که می دانید SQL زبان ساخت یافته Query یا تقاضا از بانک اطلاعاتی می باشد ، در همین راستا شرکت مایکروسافت در ورژن 3 به بعد دات نت کتابخانه ای به نام LINQ به فضا نام های خود افزوده است

LINQ (لینک) مختصر کلمه Language INtegrated Query  بوده و  یک زبان برای تقاضا از هر گونه مجموعه داده (بانک اطلاعاتی ، آرایه ها ، Xml و...) می باشد . این زبان بسیار شبیه زبان SQL بوده و با زبان های C# و Vb.NET قابل پیاده سازی است .

هدف اصلی خلق LINQ ارائه یک زبان یکتا جهت تقاضا ، برنامه ریزی و فیلتر کردن اطلاعات ذخیره شده در اشیاء مختلف اعم از پایگاه داده ، اشیا ، آرایه ها و از همه مهتر XML است ، این زبان قابلیت Debug شدن به صورت Runtime را دارست و بسیار قابل انعطاف است .

LINQ بسیار مورد پسند توسعه دهندگان وب به وِیژه دوست داران XML قرار گرفت ، شما به وسیله این زبان قادرید به همان سادگی که از  پایگاه داده تقاضا می کنید از یک ساختار XML  یا یک Object نیز تقاضا نمایید .

بنده آموزش LINQ را در سه مقاله ارائه خواهم کرد :

  1. لینک به اشیاء (LINQ to Objects)
  2. لینک به ایکس ام ال (LINQ to XML)
  3. لینک به اس کیو ال (LINQ to SQL)

 برای دیدن ادامه مطلب روی لینک زیر کلیک کنید

ادامه نوشته

Url rewriting در asp.net (تغییر یا حذف پسوند aspx در آدرس صفحات)

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

بیایید فرض کنیم که ما در ابتدا یک صفحه به نام "Products.aspx" داریم که نام یک محصول رو به عنوان ورودی querystring می گیره و اطلاعات صفحه رو بر اساس نام محصول یا شناسه فیلتر میکنه. آدرس مربوط به صفحه Products.aspx، مثل اینه :

http://www.store.com/products.aspx?category=books
http://www.store.com/products.aspx?category=DVDs
http://www.store.com/products.aspx?category=CDs

به جای استفاده از یک querystring برای نمایش هر دسته، ما می خواهیم تا تغییری در آدرس ایجاد کنیم طوری که به نظر برسد که هر دسته از محصولات یک آدرس منحصر به فرد دارد و این به موتور جستجو هم بسیار کمک میکند تا محصولات شما را به درستی معرفی کند .در ادامه این پست بیش از 4 روش مختلف را برای چنین تکنیکی بررسی می کنیم .

روش 1 : استفاده از پارامترها Request.PathInfo به جای QueryStrings

در روش اول من قصد دارم برای نشان دادن آدرس ،از روشی برای بازنویس استفاده کنم که یکی از ویژگی های نا شناخته شده در ASP.NET است . ویژگی Request.PathInfo. برای درک بهتر این روش آدرس فروشگاه اینترنتی به شکل زیر را در نظر بگیرید :

http://www.store.com/products.aspx/Books
http://www.store.com/products.aspx/DVDs
http://www.store.com/products.aspx/CDs

آدرسی به این سبک دیگر حالت Querystring ندارد و با قرار دادن کاراکتر / پس از Products.aspx موتور های جستجو آنرا به عنوان سه آدرس متفاوت می شناسند و نه به عنوان یک آدرس اینترنتی با سه مقدار ورودی مختلف .

حالا سوال اینه که چه طور باید این آدرسو تو برنامه تشخیص داد و محتوای مورد نظر بیننده رو بهش نشون داد.

شما به سادگی می توانید به کمک Request.PathInfo  پارامترهای بعد از / را از ادامه آدرس بخوانید:


public string GetCategory()
{

	if ((Request.PathInfo.Length == 0)) {
		return "";
	} else {
		return Request.PathInfo.Substring(1);
	}

}
این تابع مقدار book و dvds و cds را بازمی گرداند . اسکات گاتری در وبلاگ خود مثالی از این روش دارد که می توانید آنرا دانلود کنید .
Request.PathInfo Example
روش 2 : استفاده از HttpModule برای انجام بازنویسی آدرس
روش جایگزین برای روش Request.PathInfo استفاده از متد HttpContext.RewritePath است این روش اجازه می دهد تا یک برنامه نویس به صورت پویا مسیر پردازش آدرس های ورودی را بازنویسی کند تا ASP.NET اجرای درخواست را با استفاده از مسیر تازه ادامه دهد.

فرض کنید می خواهیم آدرس ها را به این شکل به کاربران نمایش دهیم .
http://www.store.com/products/Books.aspx
http://www.store.com/products/DVDs.aspx
http://www.store.com/products/CDs.aspx
این صفحات از نظر مراجعه کننده 3 صفحه جدا است ( و بسیار مناسب برای موتور جستجو ) اما در واقع همه این موارد به یک صفجه ارجاع داده می شود . در روش اول چون نام products.aspx در آدرس موجود بود ادامه آدرس به صفحه products.aspx ارجاع داده میشد اما چون در این روش آدرس ها به شکلی است که مفسر آدرس در سرور نمی تواند آنرا درک کند باید در جایی از برنامه مشخص کنیم که اگر آدرسی به فرم بالا دیدی آنرا به products.aspx ارجاع بده .

برای این کار می توانیم از رخداد Application_BeginReques در Global.asax استفاده کنیم . مثال :


    void Application_BeginRequest(object sender, EventArgs e) {

        
string fullOrigionalpath Request.Url.ToString();
        
        if 
(fullOrigionalpath.Contains("/Products/Books.aspx")) {
            Context.RewritePath(
"/Products.aspx?Category=Books");
        
}
        
else if (fullOrigionalpath.Contains("/Products/DVDs.aspx")) {
            Context.RewritePath(
"/Products.aspx?Category=DVDs");
        
}
    }

البته نوشتن کدهایی شبیه به این روش بسیار  خسته کننده و مستعد خطا خواهد بود .پس پیشنهاد می کنم تا از روش های دیگه استفاده کنید که بهترین اونها استفاده از ماژول هایی هستند که به صورت رایگان واسه دانلود وجود دارن .
 
این ماژول ها را در web.config معرفی می کنید و مشخص می کنید که چه الگوی آدرسی را برای تبدیل مد نظر دارید به نمونه کد زیر توجه کنید که از UrlRewriter.net استفاده شده است و در فایل web.config قرار داده شده است. ( نیازی به کد نویسی نیست )
<?xml version="1.0"?>
<configuration>

  
<configSections>
    
<section name="rewriter"  
             requirePermission
="false" 
             type
="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />
  configSections>
  
  
<system.web>
      
    
<httpModules>
      
<add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter"/>
    httpModules>
    
  
system.web>

  
<rewriter>
    
<rewrite url="~/products/books.aspx" to="~/products.aspx?category=books" />
    <
rewrite url="~/products/CDs.aspx" to="~/products.aspx?category=CDs" />
    <
rewrite url="~/products/DVDs.aspx" to="~/products.aspx?category=DVDs" />
  rewriter>  
  
configuration> 

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

  <rewriter>
    
<rewrite url="~/products/(.+).aspx" to="~/products.aspx?category=$1" /ِ>  ِ<ِ/ِrewriter>  



با استفاده از این روش شما خیلی ساده تر و فوق العاده وب سایت خود را توسعه می دهید .
یک برنامه نمونه با استفاده از این تکنیک توسط اسکات گاتری طراحی شده که می تونه کمک خیلی خوبی برای درک بهتر این روش باشه .

باید متذکر شوم که در این روش نیازی به هیچگونه تغییری در تنظیمات سرور نیست . حال به شیوه بعدی می پردازیم .

روش 3 :
استفاده از HttpModule برای انجام بازنویسی آدرس در IIS7

روش هایی که تا کنون گفته شد برای آدرسهایی مناسب است که پسوند aspx. در آدرس وجود دارد اما برای اینکه آدرس هایی ساده تر و خلوت تر از آنچه تا کنون گفته شد داشته باشیم باید کمی بیشتر تلاش کنیم .
در این روش می خواهیم آدرسی به شکل زیر را برای صفحه های وب داشته باشیم .
http://www.store.com/products/Books
http://www.store.com/products/DVDs
http://www.store.com/products/CDs

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

1- آسان به خاطر می ماند

2- موتور جستجو به آسانی دسته بندیش میکند

3- امنیت وب سایت را بالا می برد

پردازش آدرسهای فوق با استفاده از IIS5 و IIS6 آسان نیست و برای پردازش این شکل از آدرس ها باید ISAPI Extensions را در دات نت بازسازی کنید که این روش در بخش 4 تشریح خواهد شد. اما در IIS 7 مشکلی برای اینکار وجود ندارد و بدون هیچ تغییری در تنظیمات سرور می توانید وب سایت خود را با این روش آدرس دهی اجرا کنید .

به کد های زیر توجه کنید که تنظیمات مربوط به این شکل آدرس دهی را در web.config با استفاده از  URLRewriter نمایش می دهد .

<?xml version="1.0" encoding="UTF-8"?>

<configuration>

  <configSections>
    <section name="rewriter" 
             requirePermission="false" 
             type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />
  configSections>
  
  <system.web>
      
    <httpModules>
      <add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter" />
    httpModules>
    
  system.web>

  <system.webServer>

    <modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule" />
    modules>

    <validation validateIntegratedModeConfiguration="false" />

  system.webServer>

  <rewriter>
    <rewrite url="~/products/(.+)" to="~/products.aspx?category=$1" />
  rewriter>
  
configuration>

1) آن بر روی هر IIS 7.0 ماشین کار می کنند. شما یک مدیر لازم نیست که فعال کردن هر چه بر روی میزبان از راه دور. علاوه بر این در اعتماد متوسط ​​حالات میزبانی مشترک کار می کنند.


2) از آنجا که من پیکربندی UrlRewriter در هر دو حالت و  
پیش فرض IIS7  تنظیم کردم می توانم برنامه را در هم روی سرور IIS7 و هم روی سرور تعبیه شده در محیط Visual Studio به نام (aka Cassini) اجرا کنیم .

یک برنامه نمونه نیز برای این روش ارائه شده است که می توانید از اینجا دانلود کنید .


روش 4 : ISAPIRewrite به فعال کردن فرمت آدرس بدون پسوند برای IIS5 و IIS6

اگر نمی خواهید برنامه خود را روی سرور با IIS 7.0 اجرا کنید برای پیاده سازی این  روش در IIS5 و IIS6 باید از فیلتر ISAPI  برای بازنویسی آدرس ها استفاده شود .

برای استفاده از این روش بهترین ابزار موجود که رایگان هم هست Ionic's ISAPI Rewrite است .

برای بازنویسی آدرسها این ابزار یک ابزار تایید شده توسط بسیاری از شخصیت های برتر مایکروسافت است .

می توانید از وبلاگ اسکات هنسلمن هم تشریحی از این روش ببینید .


بهترین های Ajax  ( از Ajax با سرعت و کارایی بیشتر بهره بگیرید )

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

بسیار از toolKit های موجود در Ajax.Net را می توان با استفاده از ابزار های سبکتری مانند JQuery نیز پیاده سازی کرد . چند فریم ورک برای این کار وجود دارد که بنده شخصا JQuey را ترجیح می دهم . اما برای اشخاصی که نیازی به قابلیت های پیشرفته JQuery ندارند Dojo پیشنهاد می شود که بسیار سریع است . 

مقایسه ای بین بهترین های جاوا در ادامه آورده شده است که به روشنی سرعت هر framework را نشان می دهد .



نمودار مقایسه سرعت


framework ها را دانلود کنید :

Dojo

JQuery

MooTools

Prototype



Dojo 1.0.2 JQuery 1.2.3 MooTools 1.2beta2 Prototype 1.6.0.2
Mozilla Firefox 2.0.0.12 – no addons – winxp 128 266 115 259
Mozilla Firefox 2.0.0.12 – winxp 144 290 127 260
Mozilla Firefox 2.0.0.12 – linux 253 438 255 384
Opera 9.26 – winxp 32 136 148 194
Opera 9.26 – linux 110 188 238 364
Internet Explorer 7 – no addons – winxp 263 330 662 1563
Internet Explorer 7 – winxp 264 334 674 1583
Internet Explorer 6 387 600 945 2279
Internet Explorer 6 – linux (wine) 692 978 1310 2616
Safari 3.0.4 Beta 3 – winxp 36 76 84 116
Konqueror – linux 324 450 X X

کنترل های رایگان Ajax برای ASP.net 2.0 3.0 3.5

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

برای آن دسته از دوستانی هم که تازه وارد هستند مثال ها و توضیحات زیادی وجود دارد . حجم این بسته در حدو 14 مگابایت است و به همه Aspدوستا پیشنهاد میشه که ازش استفاده کنن . در پست بعدی آموزش هایی راجه به این کنترل ها خواهم گذاشت .


obout Suite for ASP.NET 2.0/3.0/3.5

  • TreeView
  • Grid
  • HTML Editor
  • Calendar
  • Easy Menu
  • Combobox
  • Listbox
  • Slide Menu
  • AJAX Page
  • Scheduler
  • Splitter
  • Tree_DB
  • Show
  • Image Zoom
  • Text Menu
  • Flyout
  • Window
  • Color Picker
  • File Upload Progress
  • Interface Controls
  • Slide Panel (with Slide Menu)
  • Spell Checker (with HTML Editor)
  • Context Menu (with Easy Menu)
  • Tab Strip (with Easy Menu)
  • AJAX Autosuggest (with Combobox & Listbox)
  • Multilevel Combobox (with Combobox)
  • Multilevel Listbox (with Listbox)
  • State Selector (with Combobox & Listbox)
DOWNLOAD
oboutSuite.exe (14mb)
This is a self-extracting archive.
It includes all controls and hundreds of examples in C# and VB.NET

به 10 دليل ويندوزتان را به ويندوز سرور 2008 R2 بروزرساني كنيد

استفاده از تكنولوژي جديد و بروز بودن در اين محور ارتباط مستقيمي به پيشرفت و بالابردن كارآيي خواهد داشت. استفاده صحيح از دسترنج كساني كه تلاش مي‌كنند تا پاي تكنولوژي به زندگيمان باز شود حاصل يك تفكر با بازتاب طلايي است، با كمي مطالعه در درك تكنولوژي‌هاي جديد كه در اطرافمان هستند سنگيني بار زمانه را به دوش نخواهيد كشيد، اما بايد به اين باور رسيد كه تكنولوژي را به اندازه نيازمان به‌كار ببريم تا نبينيم روزي را كه با استفاده غلط و مطالعه نشده در كلاف تكنولوژي سردرگم شده‌ايم.

متاسفانه در ميان افراد جامعه كم نيستند كساني كه دليل استفاده از تكنولوژي جديد و به‌روز بودن را نمي‌دانند و نيازي به به‌روز شدن در خود حس نمي‌كنند. اما چه خوب است كه شما براي بروز شدن ابتدا مطالعه و تحقيق مي‌كنيد و سپس آگاهانه و به اندازه نياز خود پا را در عرصه تكنولوژي از گليم خود درازتر مي‌كنيد. از اين رو در اين مقاله خواهيد خواند كه استفاده از تكنولوژي‌هاي جديد مايكروسافت چه ويژگي‌هايي دارد و آيا گره از كارتان خواهد گشود يا خير.

1 - پشتيباني بهتر از آخرين سخت‌افزار سرور
ويندوز سرور R22008 اولين نسخه از ويندوز سرور است كه بطور كامل معماري 32 بيتي را رها كرده است. همراه با حركت بسوي معماري 64 بيتي مايكروسافت طراحي ويندوز سرور 2008 R2 را براي پشتيباني از 256 پردازنده منطقي پايه‌ريزي كرده است. بر اين اساس مايكروسافت طراحي Hyper-V را به گونه‌اي انجام داده است كه توانايي پشتيباني از 32 پردازنده منطقي را داشته باشد در حالي كه نسخه ابتدايي از برنامه Hyper-V قابليت پشتيباني از 16 پردازنده را داشت. بطور كلي ويندوز سرور 2008 R2 براي مديريت بهتر را منابع سخت‌افزاري طراحي شده است. استفاده بهينه و كامل از منابعي چون RAM و CPU يكي از چند ويژگي‌هاي ويندوز سرور 2008 R2 است.

2- بهينه‌سازي مصرف انرژي
اين روزها صاحبان صنايع در پي راه‌حل مناسبي جهت كم كردن هزينه‌هاي جاري خود هستند. براي صنعت IT نيز ويندوز سرور 2008 R2 يكي از اين راه‌حل‌ها محسوب مي‌شود، چرا كه استفاده بهينه از منابع انرژي و بهينه‌سازي مصرف برق يكي از ويژگي‌هاي اين نسخه از ويندوز است. استفاده از ويندوز 7 و ويندوز سرور 2008 R2 با توجه به اضافه شدن group plicy مربوط به مديريت منابع و انرژي راهكاري بسيار مناسبي در راه رسيدن به اين هدف مي‌باشد.

3- بهره‌مندي از IIS 7.5
ويندوز سرور 2008 R2 با آخرين نسخه از برنامه Internet Information Services (IIS) همراه است و همراهي IIS با بهترين راهكارهاي امنيتي براي وب‌سايت‌ها و سرورهاي ارائه خدمات ميزباني وب يكي از دلايل محكم و بهره‌مندي از امنيت بيشتر است، به عنوان مثال شما در نسخه‌هاي قبلي IIS از برنامه مفيد امنيتي URLscan چيزي نخواهيد ديد، اما در اين نسخه از IIS برنامه URLscan 3.0 نيز به‌صورت اتوماتيك با IIS 7.5 همراهي مي‌كند تا بتواند امنيت بيشتر و بهتري برايتان ايجاد كند.

4 - بهره‌مندي از PowerShell 2.0
خوشبختانه يكي از ويژگي‌هاي ويندوز سرور 2008 R2 همراهي نسخه جديد PowerShell 2.0 است و با آن مي‌توانيد در ويندوز سرور 2008 R2 نسخه اورجينال بيش از يكصد فرمان تحت محيط خط فرمان يا همان command-line را اجرا كنيد و بصورت حرفه‌اي‌تر به محيط تست و عيب‌يابي ويندوز وارد شويد.

5 - دسترسي مستقيم
هركسي كه تجربه پشتيباني كاربران از راه دور را دارد مي‌داند كه اين چه كار عذاب‌آوري است و البته امروز تقريبا همه انتظار دارند كه بتوانند از راده دور كار كنند. خوشبختانه مايكروسافت روش اين كار را با ستفاده از يك فلسفه جديد براي دسترسي از راه دور آسان كرده است. در ويندوز سرور 2008 R2 ديگر تفاوتي بين يك اتصال محلي و يا اتصال از راه دور وجود ندارد. اساساً، در مورد تمامي اتصالات به شكلي مشابه عمل مي‌شود و ويندوز محاسبات پشت پرده را انجام مي‌دهد. ويژگي كه اين كار را عملي مي‌كند به دسترسي مستقيم يا همان Direct access معروف شده است.

6 - ميزكار مجازي يكپارچه
ويژگي Terminal Service سالهاست كه در ويندوز سرور در دسترس است اما ويندوز سرور 2008 R2 يك ميزكار مجازي يكپارچه و پيشرفته را ارائه كرده است. اين ويژگي دو مزيت دارد؛ اول اينكه برنامه‌هاي ميزبان در منوي استارت ظاهر مي‌شود و اين حالت برنامه‌هايي كه به‌صورت محلي بر روي سرور نصب شده است نيز صادق است. براي كاربر تفكيك برنامه‌هاي نصب شده قبلي و اختصاصي كاربر كمي دشوار بود، اما هم اينك ويندوز سرور 2008 R2 اين تفكيك‌پذيري را انجام داده است. مزيت دوم اين است كه توابع گرافيكي (برخي توابع I/O مانند صفحه كليد و يا ماوس) اينك از طريق ميزكار كاربر اداره خواهد شد. اين بدين معناست در هر با ارتباط با سرور از راه دور از منابع كمتري از سرور استفاده خواهد شد و بنابراين مي‌توان از اين منابع به شكل كارآمدتري استفاده كرد.

7 - بهره‌مندي از تكنولوژي Branch Cache
استفاده از تكنولوژي Branch Cache يكي از بهترين ويژگي‌هاي جديد در ويندوز سرور 2008 R2 ناميده مي‌شود. ايده پشت پرده اين ويژگي جهت بالا بردن كارآيي ارتباطات در محيط WAN به وجود آمده است، به اين ترتيب كه فايل‌هايي كه بر روي سرور قرار گرفته است و كاربران در دفاتر و شعب مختلف بايد به آنها دسترسي داشته باشند مشترك مي‌شود. پيمودن مسير از مبدا تا مقصد و در دسترس قرار دادن فايل‌ها به‌صورت جداگانه براي هر كاربر مستلزم بالا بودن سرعت ارتباط و به هدر رفتن پهناي باند مي‌شود. از اين رو اين تكنولوژي به اشتراك‌گذاري فايل‌ها بين چندين كاربر به‌صورت مشترك را پيشنهاد مي‌دهد. اين تكنيك مي‌تواند كمك بزرگي به كاهش هزينه‌هاي پهناي باند در سرور اصلي باشد و تنها در صورت تغيير فايل اصلي در سرور اين مسير بايد از اول پيموده شود.

8 - ويندوز سرور Backup
يكي از دغدغه‌هاي شركت‌ها براي اطمينان خاطر از روند كار سرورهاي اطلاعاتي تهيه نسخه پشيبان و استفاده از آن در شرايط اضطراري و ضروري است. استفاده از برنامه‌هاي جانبي مانند Acronis و Symantec Gost براي تهيه نسخه پشتيبان و يا برنامه همراه با ويندوز (NTBACKUP) يكي از راهكارهاي پيش روي شركت‌ها بوده است. اما زماني كه ويندوز سرور 2008 به بازار آمد فاقد برنامه تهيه نسخه پشتيبان‌گيري بود و براي بسياري از شركت‌ها استفاده از نرم‌افزارهاي جانبي بسيار سنگين بود و مايكروسافت در نسخه جديد ويندوز سرور 2008 R2 نيز مجددا برنامه حرفه‌اي (NTBACKUP) را به اين مجموعه اضافه كرده است و از نظر قابليت‌هاي نسخه‌هاي قبلي مورد اطمينان‌تر و پيشرفته‌تر است و براي راه‌اندازي سيستم پشتيبان‌گيري يكي از ابزارهاي معقول تبديل شده است.

9 - بهترين روش‌هاي آناليز و تجزيه تحليل
در حال حاضر مايكروسافت نسخه‌اي از برنامه اختصاصي خود با نام (The Best Practices Analyzer) را براي IIS ارائه كرده است پيش از اين اين برنامه به‌صورت يكي از افزونه‌هاي مايكروسافت بود، اما با گذشت زمان و استقبال كاربران حرفه‌اي از اين ابزار براي روش‌هاي آناليز مايكروسافت آن براي ويندوز سرور 2008 R2 به‌صورت رايگان و مستقيم درنظر گرفته است به طوري كه اكنون مي‌توان تجزيه و تحليل سرويس‌هاي مختلف سرور مانند IIS ،SQL Server و ISA Server را با چنين ابزراهايي انجام داد.

10 - Hyper-V
قبلاً هم اشاره كرده بودم Hyper-V با طراحي دوباره توانايي پشتيباني از 32 پردازنده را دارد، اما اين بار مي‌خواهم به يكي ديگر از برجستگي‌هاي اين برنامه اشاره كنم. از مهم‌ترين مسايلي كه ممكن است هنگام استفاده از تكنولوژي‌هاي مجازي‌سازي در پيش داشته باشيد انجام نقل‌وانتقال از يك ميزبان مجازي به يك ميزبان ديگر است، اين اتفاقيست كه ممكن است براي هر كاربري پيش آمده باشد و با سپري شدن زماني كوتاه يا بلند به هدف خود رسيده باشيد. اين بار انجام چنين نقل‌وانتقالي در Hyper-V بدون وقفه و يا به عبارتي بدون Downtime انجام خواهد شد، قابليت كوچك ديگري كه به برجستگي اين ابزار مي‌افزايد اضافه كردن هارد مجازي به ماشين مجازي بدون نياز به بارگذاري و يا ريست كردن مجدد ويندوز است.

انتقال اطلاعات بین صفحات توسط QueryString

ساده ترین و پر کابردترین و شاید بهترین راه انتقال اطلاعات بین صفحات رشته های تقاضا یا QueryString ها میباشند .
QueryString ها در حقیقت رشته ای از حروف هستند که به دنبال آدرس صفحه مورد نظر و بعد از کاراکتر ؟ ظاهر میگردند و در بردارنده یک متغیر به همراه یک مقدار اختصاص یافته میباشند .
برای روشن شدن این موضوع مثال زیر رو در نظر بگیرید:
شما وارد سایت ipp.blogfa.com شدید در صفحه اول اگربه نوار آدرس نگاهی بندازید چنین نوشته ای رو خواهید http://www.ipp.blogfa.com/default.aspx
این نوشته نشان میدهد که صفحه که شما داخل آن قرار دارید صفحه default هست و پسوند این صفحه aspx  است خوب حالا مقاله مورد نظرتون رو انتخال میکنید و روی آن کلیک می نمایید . حالا وارد صفحه نمایش مقاله شده اید بهتر است الان هم یک نگاهی به آدرس بار بندازید چه میبینید؟
کدی مشابه : http://ipp.blogfa.com/article.aspx?code=54b5a658-11fe-4349-b135-4284806b09ff
اکنون میتوانید درک کنید که QueryString چیست در حقیقت تمام رشته حروفی که بعد از علامت سوال نوشته شده جزو QueryString محسوب می شود ، این رشته به صفحه میگوید که متغیری به نام code مقدارش 54b5a658-11fe-4349-b135-4284806b09ff می باشد .
این کد باعث میشود ما بفهمیم که کاربر کدام مقاله را درخواست داده ، بنابراین به سادگی با یک دستور SQL مقاله مورد نظر کاربر را به او نمایش می دهیم .


خوب فرض کنید که یک صفحه دارید و یک تکس باکس به همراه یک باتن. میخوایم مقداری رو داخل تکس باکس بنویسیم و سپس وقتی باتن کلیک شد وارد صفحه جدیدی بشویم که فقط یک  Label در آن وجود دارد و بطور خود کار مقداری که ما داخل TextBox صفحه اول نوشته بودیم داخل آن Label چاپ شود :
فرض کنید نام صفحه اول first.aspx نام صفحه دوم second.aspx آیدی TextBox داخل صفحه اول mytext و آیدی Label داخل صفحه دوم mylabel باشد ...
بر روی باتن صفحه اول دو بار کلیک کنید و در ساب روتین مربوط به رویداد کلیک شدن باتن کد زیر رو بنویسید :

Response.Redirect("second.aspx?myvalue=" + mytext.text)


اگر با متد Response.Redirect آشنا باشید میدانید که این متد صفحه را به صفحه ای که داخل کوتیشن نوشته شده انتقال میدهد
خوب بعد از نوشتن آدرس صفحه دوم یک علامت سوال گذاشتم  و بعد از آن اسم متغیرم را نوشتم ( این متغیر میتواند هر اسم دلخواهی را اختیار کند ) و بعد این متغیر را مساوی مقداری که داخل TextBox نوشته شده قرار دادم( از عملگر &   برای چسباندن دو رشته حرف به هم استفاده می شود )
اکنون وارد صفحه دوم شوید و بر روی صفحه دابل کلیک کنید تا ساب روتین رویداد مربوط به لود شدن صفحه باز شود و داخل آن کد زیر رو بنویسید :
 
mylabel.text == Request.QueryString("myvalue")
 
اگر با متد Request آشنا باشید میدانید که این متد برای درخواست های مختلف بکارمی رود و متد Request.QueryString برای دریافت مقادیر موجود در متغیر تعریف شده در QueryString می باشد.
 
 
 
باید به یک نکته دقت کنید که اصلا مهم نیست که نام متغیر شما چچیست ( مثلا در اینجا myvalue) مهم این است که متغیر ارسالی و درخواستی شما یکی باشند ، یعنی اگر نوشتید secon.aspx?yourname=ali  در صحفه که میخواهید مقدار متغیر را   دریافت کنید باید بنویسید :

Request.QueryString("yourname")

واضح است که مقدار برگشتی کد فوق ali می باشد.
 
فرض کنید بخواهید چند متغیر را توسط .QueryString ارسال کنید اگه مقادیر شما مشخص باشد که کار خیلی سادست :
Response.Redirect("second.aspx?name=arash&family=vahabi&age=22")

در کد فوق نام و نام خانوادگی و سن من برای فرم دوم ارسال شده است .
 
حال اگه مقادیر  بصورت پارامتری باشند از کاراکتر & برای الصاق رشته های ثابت به متغیر های استفاده می کنیم :
  1. {
  2.     string myname = "arash";
  3.     string myfamily = "vahabi";
  4.     string myage = "22";
  5.    
  6.     Response.Redirect("second.aspx?name=" + myname + "family=" + myfamily + "age=" + myage);
  7. }
و درصفحه دوم برای دریافت مقادیر متغیر ها داریم :
 

1.namelabel.text = Request.QueryString("name")
2.familylabel.text = Request.QueryString("family")
3.agelabel.text = Request.QueryString("age")
 
 
مزایا : QueryString بر خلاف سایر روش های انتقال اطلاعات بسیار سبک بوده هیچ فضایی برای ذخیره لازم ندارند استفاده از آن بسیار سادست و بسیار سریع انتقال پیدا میکنند.
معایب : QueryString ها بسیار نا امن میباشند چون داخل Address Bar  جابجا می شوند همه کاربران قادر به مشاهده آنها هستند .
همچنین برای انتقال مقادیر بزرگ و مقادیر غیر رشته ای نمیتوان از QueryString استفاده کرد.
 
همانطور که گفته شد یکی از عیب های QueryString نا امن بودن آن است ، برای حل این مشکل شما میتوانید مقادیر رشته ای که بین صفحات جابجا میشوند را Encode کنید و در صفحه بعد Decode نمایید :
در مثال زیر بنده اسم خود را Encode کرده و در صفحه بعد قبل از نمایش آن را Decode می نمایم :
 
  1. {
  2.     string myname = "arash vahabi";
  3.     string encode_myname = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(myname));
  4.     Response.Redirect("second.aspx?myname=" + encode_name);
  5. }
 
 
اگر به آدرس بار نگاه کنید میبینید که اسم من به کد زیر تبدیل شده که دیگه قابل فهم نیست  :
QWxpIERlbHNoYWQ=
 
در حقیقت Url  به صورت زیر در می آید :
 
second.aspx?myname=QWxpIERlbHNoYWQ
 
در صفحه دوم برای دریافت و Decode کردن مقادیر به صورت زیر عمل می کنیم :
 
  1. {
  2.     byte[] arrData = Convert.FromBase64String(Request.QueryString("myname"));
  3.    
  4.     string namelabel = System.Text.Encoding.ASCII.GetString(arrData);
  5. }
 
البته برای انتقال اطلاعات به صورتی که قابل مشاهده برای بازدید کننده نباشد و همچنین جابجایی اطلاعات حجیم تر راه های دیگری نیز وجود دارد که برخی از آن ها به شرح زیر است :
 

Paint.NET، داستان موفقیت یک پروژه کدباز

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

paint.net logo

Paint.NET یک پروژه اوپن سورس و آزاد است. هر کس می تواند با رفتن به وب سایت رسمی Paint.NET (یا هرسایت دیگر +) نسخه ای از آن را دریافت و روی ویندوز خودش نصب کند و بدون پرداخت هیچ هزینه ای از آن برای هر کاری (چه شخصی و چه تجاری) استفاده کند. کد این پروژه در دسترس همه قرار دارد و هرکسی می تواند در پیشرفت این پروژه سهیم باشد.

در این مطلب کوتاه به تاریخچه ایجاد نرم افزار Paint.NET و داستان موفقیت آن می پردازیم. سپس در مورد اینکه چطور درآمدزایی می کند بحث می کنیم و در آخر نیز دلایل موفقیت این پروژه را از نظر خودم به صورت خیلی خلاصه بیان می کنم.

همه چیز از یک پروژه دانشجویی شروع شد…

Paint.NET در بهار سال 2004 به عنوان یک پروژه دانشجویی سال آخر رشته علوم کامپیوتر مقطع لیسانس از دانشگاه Washington State University شروع شد. Rick Brewster دانشجوی با سلیقه ای که روی طراحی رابط کاربری و گرافیک مسلط بود به عنوان رهبر توسعه تیم انتخاب شد. زبان سی شارپ به عنوان زبان برنامه نویسی و دات نت فریم ورک به عنوان پلت فرم توسعه برگزیده شدند. پس از طراحی نسخه اولیه  و پس از هماهنگی با شرکت مایکروسافت، Paint.NET به عنوان نام این پروژه انتخاب شد. پس از این اتفاق، توجه مایکروسافت به این پروژه معطوف شد.

برای نسخه اول، مایکروسافت دو نفر از کارمندان خود را مامور نظارت روی این پروژه کرد. یک نفر به عنوان مربی و راهنما و دیگری به عنوان اسپانسر و تامین کننده هزینه های این پروژه دانشجویی شروع به همکاری کردند. نسخه اول به عنوان یک نرم افزار کدباز تحت دات نت، موفقیت خوبی را بدست آورد. همین موقع ها بود که مایکروسافت در پی جا انداختن پلت فرم دات نت میان برنامه نویسان بود. Paint.NET به عنوان یک مثال قدرتمند و عالی برای پلت فرم دات نت بود. مایکروسافت خوشحال بود چون این پروژه به برنامه نویسان نشان می داد که با دات نت فریم ورک می توان نرم افزارهای بهینه گرافیکی ساخت و کاربران معمولی ویندوز نیز می توانستند از یک نرم افزار قدرتمند تر از Paint به صورت رایگان برای ویرایش تصاویر دیجیتالی خود روی ویندوز استفاده کنند.

نمایی از نسخه 3.5 بتا Paint.NET

نمایی از نسخه 3.5 بتا Paint.NET

در دسامبر 2004، نسخه 2.0 پایدار با امکانات قدرتمند و پشتیبانی از افکت های بیشتر عرضه شد. در می 2005 نسخه 2.1 در حالی که اکثر باگ های نسخه های قبل رفع شده بود و کارایی نرم افزار بالاتر رفته بود، عرضه شد. در نسخه 2.5 پشتیبانی از محلی سازی برای زبان های مختلف اضافه شد و در نسخه 2.6 پروژه به دات نت فریم ورک نسخه 2.0 منتقل شد و از معماری 64بیت به صورت کامل پشتیبانی شد. از این نسخه به بعد Rick Brewster و Tom Jackson توسعه دهنده های اصلی Paint.NET هستند. در می 2006 Paint.NET با دو میلیون دانلود خود را به عنوان یکی از بهترین نرم افزارهای ویرایش تصاویر دیجیتالی در سیستم عامل ویندوز معرفی کرد.

Rick Brewster

Rick Brewster

ریک بروستر شرکتی به نام dotPDN تاسیس کرد و لوگو و نشان تجاری Paint.NET را به نام خود ثبت کرد. dotPDN شرکتی است که تا الان تنها محصولش Paint.NET است و هزینه های خود را از راه Donation و تبلیغات اینترنتی تامین می کند. هم اکنون آخرین نسخه Paint.NET نسخه 3.5 بتا است که با استفاده از دات نت فریم ورک 3.5 توسعه پیدا می کند. (دریافت کنید) Paint.NET دارای اجتماع کاربری مناسبی است که در آن کاربران به یکدیگر در زمینه های مختلف نرم افزار Paint.NET کمک می کنند. (اینجا) هیچ سئوالی در این جامعه کوچک بی پاسخ نمی ماند.

Paint.NET چگونه درآمدزایی می کند؟

شاید این سئوال برای شما پیش بیاید که این نرم افزار که هم کدباز است و هم رایگان، چگونه درآمدزایی می کند و چه نفعی برای سازنده اش دارد. در پاراگراف بالا اشاره کردم که شرکت dotPDN از طریق Donation (هدیه نقدی کاربران) و تبلیغات اینترنتی هزینه های خود را تامین می کند. اگر به وب سایت Paint.NET مراجعه کنید، در بخش هایی از آن، حتماً تبلیغات گوگل را مشاهده خواهید کرد. بسیاری از کاربران Paint.NET نیز به صورت داوطلبانه به سازنده آن کمک نقدی کرده اند و می کنند. شرکت مایکروسافت هم که اسپانسر این پروژه است. Donation و استفاده از تبلیغات یکی از معمول ترین راه های درآمدزایی نرم افزارهای کدباز هستند. (اطلاعات بیشتر)

ریک بروستر توسعه دهنده اصلی Paint.NET در حال حاضر، در دنیای دات نت و اوپن سورس اسم و رسمی دارد. اینطور که به نظر میرسد در مایکروسافت نیز مشغول به کار است (البته برای این حرفم منبع معتبری پیدا نکردم). موقعیت های شغلی یکی از مزایای توسعه پروژه های نرم افزارهای کدباز است که برای ریک نیز بوجود آمده است.

دلایل موفقیت Paint.NET (از نظر من)

اولین و مهمترین دلیل موفقیت Paint.NET از نظر من اوپن سورس بودن این پروژه است. اگر کدباز نبود امکان این که توجه شرکت مایکروسافت را به خودش جلب کند بسیار پایین بود و اگر مایکروسافت از آن پشتیبانی نمی کرد، شاید هیچ وقت تا این حد موفق نمی شد. دلیل مهم دیگر موفقیت این پروژه، بی شک دانشگاه واشنگتن استیت واستاد راهنمای ریک بروستر آقای Jack Hagemeister بوده اند که با انجام چنین پروژه ای موافقت نموده اند و امکان همکاری با مایکروسافت را برای او فراهم کرده اند.

موقعیت ریک را در زمان دانشجویی با یک دانشجوی رشته کامپیوتر در ایران مقایسه کنید. آیا دانشگاه های ما به چنین پروژه هایی بها می دهند؟ آیا ارتباط دانشگاه و صنعت در ایران آنقدر قوی است که یک شرکت تجاری اسپانسر یک پروژه دانشجویی شود و به پیشرفت آن کمک کند؟

به نظر شما اگر آقای بروستر در یکی از دانشگاه های ایران دانشجو بود، می توانست چنین پروژه موفقی را به انجام برساند!؟

منبع : farasun.wordpress.com

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

در اکثر برنامه های کامپیوتری نیاز به ذخیره و بازیابی داده ها وجود دارد. داده هایی که بدون آن ها سیستم نرم افزاری ما معنایی ندارد. برنامه نویسان معمولاً راه های مختلفی برای این کار سراغ دارند. کسانی که با دات نت فریم ورک برنامه نویسی می کنند راه های مختلفی برای دسترسی به داده ها دارند. در این مطلب با تکنولوژی های مایکروسافت برای این کار آشنا خواهیم شد و سه ORM معروف دنیای دات نت را معرفی خواهیم کرد. مایکروسافت انتخاب های زیادی برای دسترسی به داده ها به برنامه نویسان دات نت می دهد که شما باید با بررسی آن ها و با توجه به نیازهای خودتان یکی از آن ها را انتخاب کنید.

ADO.NET

ADO.NET مجموعه ای از کامپوننت هاست که برنامه نویسان می توانند از آن ها برای برقراری ارتباط با دیتابیس های مختلف استفاده کنند. ADO.NET بخشی از کتابخانه کلاس های پایه دات نت فریم ورک است که توسط مایکروسافت توسعه داده می شود. برنامه نویسان به صورت گسترده از این تکنولوژی برای دسترسی و دستکاری داده های ذخیره شده در یک دیتابیس رابطه ای استفاده می کنند. ADO.NET می تواند با اکثر دیتابیس های موجود کار کند، هر چند به صورت پیش فرض در دات نت فریم ورک فقط فراهم کننده های SQL Server، OleDb و Odbc وجود دارد، افراد و شرکت های دیگر فراهم کننده های دیتابیس های دیگر را برای دات نت ایجاد کرده اند.

برای هر Provider کامپوننت هایی وجود دارند که برنامه نویس با استفاده از آن ها به مقصودش می رسد. به طور مثال برای استفاده از SQL Server در روش ADO.NET کامپوننت هایی مانند SQLConnection و SQLCommand وجود دارد که با استفاده از آن ها می توانید یک دستور SQL را روی داده های موجود در یک دیتابیس SQL Server اجرا کنید. با SQLConnection به دیتابیس موجود در SQL Server وصل می شویم و با استفاده از یک SQLCommand می توانیم یک عبارت T-SQL را که می تواند دستور INSERT, UPDATE, DELETE یا SELECT باشد یا حتی یک Stored Procedure یا عبارت DDL باشد را برای مقصود خاصی روی دیتابیس اجرا کنیم. چون ADO.NET در مورد سینتاکس دیتابیس چیزی نمی داند، دستورات را به صورت یک رشته ساده به SQLCommand می دهیم و این شیء نیز به صورت مستقیم به دیتابیس دستور می دهد.

string query = "SELECT * FROM tblCustomers";
SqlConnection con = new SqlConnection(cnnString);
SqlCommand command = new SqlCommand(query, con);
con.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Response.Write(reader.GetInt32(0) +
reader.GetString(1));
}

نکته ای که باید در مورد ADO.NET بدانید این است که برای استفاده از هر سیستم دیتابیس رابطه ای، مجموعه کامپوننت های جدایی وجود دارد. در مثال بالا از آبجکت های مربوط به SQL Server استفاده کردیم. اگر بخواهید مثلاً از یک دیتابیس اوراکل در برنامه خود استفاده کنید، بایستی از کامپوننت های مربوط به اوراکل استفاده کنید. خوشبختانه تمام این کامپوننت ها بر پایه یک Interface ساخته شده اند، این یعنی شما می توانید با استفاده از کلاس DbProviderFactory برنامه ای بسیازید که با چند نوع دیتابیس مختلف کار کند.

Linq to SQL

مایکروسافت با دات نت فریم ورک 3.0 و 3.5 یک ORM به نام Linq to SQL را به عنوان بخشی از پروژه LINQ خود عرضه کرد. این شرکت مدت ها پیش از آن قول داده بود که یک ORM برای دات نت فریم ورک طراحی کند اما تا نسخه 3.0 دات نت فریم ورک خبری از آن پروژه نشد. Linq to SQL به شما اجازه می دهد که کوئری های LINQ را روی دیتابیس های SQL Server اجرا کنید. علاوه بر این از یک Mapping Framework بهره می برد که به برنامه نویسان اجازه Map کردن جدول های یک دیتابیس را به کلاس ها و بالعکس می دهد. این کار در ویژوال استادیو می تواند به صورت ویژوال یا کدنویسی انجام گیرد. به این صورت که برای هر جدول از دیتابیس یک کلاس تعریف می شود که هر ستون از یک جدول به عنوان یک Property درون آن کلاس تعریف می شود.

نمایی از ابزار طراحی ویژوال Linq to SQL

به مثال زیر توجه کنید :
public class Customer
{
[Column(Name="CustomerID",IsPrimaryKey = true)]
public long ID
{
get { return _ID;}
set { _ID = value;}
}
[Column(Name = "CustomerName")]
public string Name
{
get { return _name; }
set { _name = value; }
}
}

کلاس بالا به جدول tblCustomers که دارای دو ستون CustomerID و CustomerName است Map می شود. قبل از اینکه بخواهید از Linq to SQL استفاده کنید باید این کلاس ها را تعریف کنید. ویژوال استادیو 2008 دارای ابزاری است که به صورت ویژوال به شما امکان Map کردن جدول های یک دیتابیس SQL Server را به کلاس های دات نت می دهد. این ابزار می تواند به صورت اتوماتیک کلاس های مورد نیاز شما را از روی مدل دیتابیس بسازد، و حتی اجازه تغییرات دستی و ایجاد Viewهای مختلف از دیتابیس را به شما می دهد. عملیات Mapping با استفاده از DataContext (که یک رشته اتصال به سرور نیاز دارد) پیاده سازی می شود. سپس شما قادر خواهید بود کوئری های LINQ خود را روی دیتابیس موجود در سرور اجرا کنید، که البته این کوئری ها ابتدا به دستوارت T-SQL متناظر ترجمه و سپس روی دیتابیس مورد نظر اجرا می شوند.

Entity Framework

Entity Framework یک فریم ورک ORM برای دات نت فریم ورک است که نسخه یک آن به همراه دات نت فریم ورک 3.5 سرویس پک 1 عرضه شد اما مورد استقبال توسعه دهندگان قرار نگرفت. نسخه 2 این فریم ورک به صورت بتا به عنوان بخشی از ویژوال استادیو 2010 قابل دسترس است. ADO.NET Entity Framework نام اصلی این فریم ورک است و جزئی از تکنولوژی ADO.NET است.

ابزار طراحی Entity Framework در ویژوال استادیو

ابزار طراحی Entity Framework در ویژوال استادیو

Entity Framework مدل رابطه ای موجود در یک دیتابیس را به مدل مفهمومی تبدیل می کند و آن را به اپلیکیشن ما تحویل می دهد. در مدل رابطه ای عناصر ترکیبی از جداول هستند، به همراه کلید های اصلی و خارجی که جدول ها را به هم مرتبط می سازند. برعکس آن، انواع موجودیت ها مدل مفهومی داده را تعریف می کنند. انواع موجودیت  اجتماعی از چند فیلد است (هر فیلد به یک ستون از دیتابیس Map می شود) و می تواند شامل اطلاعات از چند جدول فیزیکی باشد. انواع موجودیت می توانند به هم مرتبط باشند، مستقل از ارتباطاتی که در مدل فیزیکی دارند. شمای منطقی و نگاشت (mapping) آن به شمای فیزیکی به عنوان یک Entity Data Model یا EDM نمایش داده می شوند که مشخصات EDM در یک فایل XML ذخیره می شود. Entity Framework از EDM برای انجام عملیات نگاشت و دادن قابلیت کار با موجودیت ها به اپلیکیشن استفاده می کند. Entity Framework اطلاعات مورد نیاز هر موجودیت را با Join کردن چندین جدول از مدل فیزیکی (دیتابیس) بدست می آورد. هنگامی که اطلاعات یک موجودیت آپدیت می شود، Entity Framework بررسی می کند که داده ها مربوط به کدام یک از جدول های موجود در دیتابیس هستند، سپس آن ها را با دستور SQL مناسب آپدیت می کند.

هر چند Entity Framework و Linq to SQL بسیار شبیه به هم به نظر می رسند، هر دو ابزارهایی برای طراحی گرافیکی و ویزاردی برای نگاشت یک دیتابیس به مدل شیء گرا دارند و هر دو می توانند از کوئری های LINQ برای مقصود خاصی استفاده کنند، اما با هم تفاوت هایی هم دارند. بیان تفاوت های این دو در این مطلب جایی ندارد.

NHibernate

نمی توان در مورد ORMها در دات نت صحبت کرد اما نام NHiernate را ذکر نکرد. NH یک فریم ورک ORM اوپن سورس برای دات نت فریم ورک است که از روی پروژه موفق Hibernate جاوا وارد دنیای دات نت شد. توضیحات بیشتر در مورد NHibernate توضیحات اضافی است، زیرا این فریم ورک هم وظیفه ORMهای دیگر را انجام می دهد. اکثر برنامه نویسانی که از NH برای نگاشت استفاده می کنند، ابتدا کلاس های خود را تعریف می کنند و سپس با استفاده از یک فایل XML آن ها را به جدول های دیتابیس Map می کنند. Linq to SQL و Entity Framework برخلاف NHibernate از روش Model-first یا مبتنی در دیتابیس استفاده می کنند، به این معنی که هر دو ORM تصور می کنند شما دیتابیسی در اختیار دارید که می خواهید آن به تعدادی آبجکت Map کنید.

در مورد Nhibernate بیش از این صحبت نمی کنم، آقای وحید نصیری در اینجا به صورت کامل در مورد این ORM محبوب نوشته است.

انتخاب از میان روش های بالا به عهده خود شماست. در این مطلب کوتاه نمی توان به بررسی تمام زوایا و تفاوت های میان آن ها پرداخت. در مطالب آینده سعی میکنم در مورد نحوه استفاده از هر کدام یک مثال عملی بزنم (البته به جز NHibernate).

منبع : farasun.wordpress.com

Ajax : تحولی بزرگ در عرصه وب ( بخش هفتم )

Ajax : تحولی بزرگ در عرصه وب ( بخش هفتم )

آنچه تاكنون گفته شده است :

تاکنون و در طی شش مقاله با مواردی نظیر شی XMLHttpRequest ، برخی الگوهای Ajax استفاده شده در زمان پیاده سازی برنامه های وب قدرتمند با توانائی ایجاد تعامل بیشتر ، معماری  ASP.NET AJAX  و سناریوهای مختلف پیاده سازی آشنا شدیم .

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

مدل پیاده سازی با محوریت سرویس دهنده
همانگونه که در بخش ششم اشاره گردید ، در این مدل ، منطق برنامه و اكثر عناصر بخش رابط كاربر بر روی سرويس دهنده باقی می مانند و در ادامه ، تغییرات مورد نیاز رابط کاربر برای برنامه مرورگر ارسال می گردد ( در مقابل این که تغییرات از طریق اجرای اسکریپت های سمت سرویس گیرنده ایجاد شوند) .
برای آشنائی عملی با مدل فوق ، در ادامه یک نمونه مثال ساده و در عین حال کاربردی را با یکدیگر دنبال می نمائیم .

مثال : ایجاد یک صفحه مبتنی بر Ajax با تمرکز بر روی پتانسیل های سمت سرویس دهنده فریمورک ASP. NET Ajax 
در این مثال می خواهیم تعداد مقالاتی را که بر روی سایت سخا روش و در هر یک از گروه های مختلف منتشر شده است ، به اطلاع ملاقات کنندگان سایت برسانیم .برای سادگی کار ، فرض می شود  که تعداد مقالات منشتر شده بر روی سایت از طریق بانک اطلاعاتی  بازیابی نخواهد شد و  در مقابل از یک کلاس با نام Maghalat برای بازیابی تعداد مقالات منشتر شده در هر گروه استفاده خواهیم کرد . کلاس فوق دارای صرفا" یک متد با  GetNumberOfMaghalat است که وظیفه آن برگرداندن تعداد مقالات منتشر شده در  هر گروه است .
پس از آشنائی اولیه با صورت مسئله ، مراحل زیر را برای پیاده سازی یک صفحه وب مبتنی بر Ajax با محوریت سرویس دهنده ، دنبال می نمائیم .

مرحله اول : ایجاد سایت
اولین مرحله در پیاده سازی هر نوع برنامه وب مبتنی بر ASP. NET ، ایجاد وب سایت اولیه است . بدین منظور از برنامه ویژوال استودیو نسخه های 2005 و یا 2008 استفاده کرده ( و یا نسخه Visual Web Developer  ) و برای وب سایت خود تمپلیت ASP.NET AJAX-Enabled Web Site را انتخاب می کنیم . بدین ترتیب ، یک وب سایت با قابلیت استفاده از اسمبلی ASP. NET AJAX ( با نام System.Web.Extensions.dll  ) از طریق GAC ( برگرفته شده از   Global Assembly Cache  ) ایجاد می گردد . این کار همچنین باعث ایجاد یک فایل web.config  پیچیده می گردد که شامل تنظیمات اضافه دیگر برای ارتباط با فریمورک ASP. NET AJAX است .
شکل 1 ، نحوه انتخاب تمپلیت ASP.NET AJAX-Enabled Web Site  را در زمان ایجاد یک وب سایت نشان می دهد .

 انتخاب تمپلیت ASP.NET AJAX-Enabled Web Site

شکل 1 : انتخاب تمپلیت ASP.NET AJAX-Enabled Web Site 
در زمان ایجاد یک وب سایت

مرحله دوم : طراحی و پیاده سازی کلاس  Maghalat 
Maghalat یک کلاس ساده است که دارای صرفا" یک متد با نام GetNumberOfMaghalat است که گروه مقاله را به عنوان پارامتر ورودی گرفته و تعداد مقالات منشتر شده در آن گروه را برمی گرداند . بدین منظور از یک ساختار Select Case استفاده شده است تا بر اساس مقدار پارامتر ورودی ، یک عدد را بطور ایستا برگرداند ( برای سادگی کار نام گروه مقاله و تعداد آن مستقیما" در کد درج شده اند ) .
شکل 2 ، ساختار کلاس Maghalat را نشان می دهد .


شکل 2 : ساختار کلاس Maghalat

کد زیر ، کلاس فوق به همراه متد مربوطه را نشان می دهد .

کلاس Maghalat.VB

Public Class Maghalat
Public  Shared Function GetNumberOfMaghalat(ByVal ArticleGroup As String) As Integer
 Dim Count As Integer = 0
 Select Case ArticleGroup
    Case "Software"
          Count = 11
    Case "Hardware"
          Count = 12
    Case "Security"
          Count = 13
    Case "Network"
          Count = 14
    Case "other"
         Count = 15
 End Select
 GetNumberOfMaghalat = Count
End Function
End
Class 

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

<%@ Page Language="VB" AutoEventWireup="true"   %>
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" dir="rtl">
<
head runat="server">
       <
title>تست شماره یک /title>
head>
<
body>
        <
form id="form1" runat="server">
              
<asp:ScriptManager ID="ScriptManager1" runat="server" />
                 <
div>
                div>
        form>
body>
html>

تنها تفاوت صفحه فوق با سایر صفحات Default.aspx  ایجاد شده توسط ویژوال استودیو ، اضافه شدن کنترل ScriptManager است . همانگونه که قبلا" اشاره گردید ، کنترل فوق به عنوان مغز متفکر یک صفحه مبتنی بر Ajax ایفای وظیفه می نماید . کنترل فوق ، مسئولیت توزیع کدهای سمت سرویس گیرنده برای مرورگر و مدیریت بهنگام سازی جزئی ( نه تمامی صفحه ) صفحه را برعهده دارد .
پس از ایجاد اولیه صفحه وب ، از کنترل های دیگری برای طراحی بخش رابط کاربر متناسب با خواسته های موجود استفاده می کنیم . در این مثال خاص از یک کنترل ListBox جهت نمایش گروه مقاله با قابلیت AutoPostBack   و یک کنترل Label به منظور نمایش نتایج استفاده شده است  .

<%@ Page Language="VB" AutoEventWireup="true" %>
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" dir="rtl">
<
head runat="server">
    <
title>تست شماره یک title>
head>
    <
body>
        <
form id="form1" runat="server">
             <
asp:ScriptManager ID="ScriptManager1" runat="server" />
             <
div style="text-align: center">
              <
table>
               <
tr>
                 <
td colspan="3">
                     <
strong> ایجاد یک صفحه وب مبتنی بر Ajax<br />
                   
(( پیاده سازی با محوریت پتانسیل های سمت سرویس دهنده فریمورک ASP.NET Ajax )) strong>
                    <
br />
               td>
             tr>
              <
tr>
                 <
td style="width: 150px">
                     
لطفا" یک گروه مقاله را انتخاب نمائید
                 td>
                 <
td align="right" colspan="2" dir="rtl">
                   <
asp:ListBox ID="ArticleGroup" runat="server" AutoPostBack="True" Font-Names="Tahoma"
                                      
Font-Size="Small" ForeColor="#C04000">
                        <
asp:ListItem> نرم افزار  asp:ListItem>
                        <
asp:ListItem> سخت افزار  asp:ListItem>
                        <
asp:ListItem>  امنیت اطلاعات  asp:ListItem>
                        <
asp:ListItem> شبکه  asp:ListItem>
                        <
asp:ListItem سایر asp:ListItem>
                   asp:ListBox>td>
              tr>
                <
tr>
                  <
td style="width: 150px"> td>
                  <
td style="width: 100px"> td>
                  <
td style="width: 131px"> td>
             tr>
              <
tr>
                   <
td colspan="3" style="height: 18px">
                       <
asp:Label ID="LblFinalResult" runat="server" Font-Names="Tahoma" Font-Size="Small"
                                        
ForeColor="Black" Text="Label">asp:Label>td>
             tr>
          table>
          span>
          div>
   form>
body>
html>

از ListBox برای نمایش لیست گروه مقالات استفاده شده است . مقدار خصلت AutoPostBack کنترل فوق ،  True در نظر گرفته شده است تا بلافاصله پس از انتخاب یکی از آیتم های موجود در لیست ، یک PostBack به سمت سرویس دهنده تحقق یابد . این کار از طریق رویداد   SelectedIndexChanged  محقق خواهد شد که متعاقب آن روتین  ArticleGroup_SelectedIndexChanged فراخوانده می شود . در انتهای صفحه از یک کنترل Label استفاده شده است تا به کمک آن بتوان نتایج را در خروجی نمایش داد .
از طریق کد نوشته شده در روتین ArticleGroup_SelectedIndexChanged ، انتخاب کاربر تشخیص و متد مربوط به کلاس maghalat  صدا زده می شود تا پس از برگرداندن نتایج ، ماحصل کار از طریق کنترل Label نمایش داده شود .
کد روتین ArticleGroup_SelectedIndexChanged در جدول زیر نشان داده شده است .

Protected Sub ArticleGroup_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)

  LblFinalResult.Text = Maghalat.GetNumberOfMaghalat(ArticleGroup.SelectedValue)
  LblFinalResult.Text += "   "
 
LblFinalResult.Text += "مقاله تاکنون در گروه "
 
LblFinalResult.Text += "   "
 
LblFinalResult.Text += ArticleGroup.SelectedValue
  LblFinalResult.Text += "   "
 
LblFinalResult.Text += "برروی سایت سخا روش منشتر شده است "
 

End Sub

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

مایش تعداد مقالات منتشر شده در هر گروه

شکل 3 : نمایش تعداد مقالات منتشر شده در هر گروه

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

...
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
  <
ContentTemplate >
         <asp:ListBox ID="ArticleGroup" runat="server" AutoPostBack="True" Font-Names="Tahoma"
                               
Font-Size="Small" ForeColor="#C04000">
                        <
asp:ListItem> نرم افزار  asp:ListItem>
                        <
asp:ListItem> سخت افزار  asp:ListItem>
                        <
asp:ListItem>  امنیت اطلاعات  asp:ListItem>
                        <
asp:ListItem> شبکه  asp:ListItem>
                        <
asp:ListItem>  سایر asp:ListItem>
                   asp:ListBox>td>
              tr>
                <
tr>
                  <
td style="width: 150px"> td>
                  <
td style="width: 100px"> td>
                  <
td style="width: 131px"> td>
             tr>
              <
tr>
                   <
td colspan="3" style="height: 18px">
                      <
asp:Label ID="LblFinalResult" runat="server" Font-Names="Tahoma" Font-Size="Small"
                                        
ForeColor="Black" Text="Label">asp:Label>td>
             tr>
ContentTemplate>
asp:UpdatePanel>
  ...

به صورت پیش فرض ، محتویات موجود  بین تگ ContentTemplate مربوط به کنترل UpdatePanel در زمان بروز یک postback غیرهمزمان بطور اتوماتیک بهنگام خواهند شد. Postback فوق بطور غیرهمزمان اتفاق می افتد و رفتار آن با postback عادی متفاوت است . ( در postback عادی  ، یک درخواست برای سرویس دهنده ارسال می گردد تا پس از انجام پردازش های ضروری در سمت سرویس دهنده ، رابط کاربر جدید برای مرورگر ارسال گردد ) .
و اما یک سوال مهم که ممکن است در ذهن شما مطرح شده باشد . یک postback غیرهمزمان چیست ؟ اکثر پیاده کنندگان برنامه های وب به کمک فناوری ASP.NET صرفا" با یک نوع postback آشنا می باشند . با بکارگیری UpdatePanel ، صفحه روال طبیعی  حیات خود را طی می نماید ، ولی PostBack به عنوان یک postBack غیرهمزمان شناخته می شود . که در آن  از روش های هوشمندانه تری استفاده می گردد و صفحه با مدلی متفاوت تر در حین چرخه حیات خود پردازش می گردد .
در ادامه ،  همزمان با اجرای صفحه و انتخاب یک گروه مقاله ، بخش رابط کاربر بطور اتوماتیک و بدون نیاز به بازخوانی کامل صفحه بهنگام خواهد شد . بطور خلاصه ، با اضافه کردن یک مجموعه اندک از کنترل های سرویس دهنده بر روی صفحه ، از بازخوانی مجدد تمامی صفحه ممانعت بعمل آمده و همچنین در تعامل کاربر با برنامه وقفه ای ایجاد نخواهد شد .

 مرحله پنجم : بهینه سازی خروجی و ضرورت استفاده از  کنترل UpdateProgress
در صورتی  که با یک خط سرعت پائین برنامه فوق اجراء گردد ، مشاهده خواهیم کرد که زمان نسبتا" زیادی بطول خواهد انجامید تا نتایج نمایش داده شود . این موضوع ( تاخیر محسوس در مشاهده خروجی کار  ) باعث می شود  کاربری که برنامه را اجراء کرده است ، نگران عملکرد صحیح برنامه باشد و اینگونه برداشت کند که برنامه دچار اختلال شده است .
 قبل از معرفی Ajax ، برای صفحاتی که بازخوانی مجدد می گردیدند از علامتی استفاده می شد که کاربران متوجه این موضوع می شدند که فرآیندی در حال انجام است و یا درخواست آنان مورد پذیرش قرار گرفته شده است . هم اینک با توقف postback طبیعی ، کاربران متوجه این موضوع نمی شوند که عملیاتی در شرف انجام است تا این که فرآیند مورد نظر به اتمام برسد ( از علامتی برای نشان دادن این که فرآیندی در حال انجام است ، استفاده نمی شود ) . در چنین مواردی ، کاربران نیازمند یک فیدبک دیداری ( ویژوال )  هستند تا نسبت به انجام یک فرآیند در پس زمینه آگاه گردند . 
کنترل UpdateProgress یک راه حل جهت مشکل فوق را ارائه می نماید . هدف کنترل فوق ، نشان دادن  یک نشانه دیداری  به کاربران در زمان بروز یک postback غیرهمزمان است . بدین منظور می توان کد زیر را به انتهای صفحه اضافه نمود .
 

<asp:UpdateProgress ID="UpdateProgress1" runat="server">
 <
ProgressTemplate >
  <
img src=" images/ajax1.gif " />  در حال بارگذاری ...
 ProgressTemplate>
asp:UpdateProgress>

پس از اجرای برنامه ( با لحاظ کردن کنترل UpdateProgress   )  ، پس از انتخاب یک گروه مقاله توسط کاربر یک نشانه دیداری نمایش داده خواهد شد . شکل 4 ، خروجی برنامه را به همراه نشانه دیداری نشان می دهد .

ارائه یک نشانه تصویری در زمان تحقق یک postback غیرهمزمان

شکل 4 : ارائه یک نشانه دیداری در زمان تحقق یک postback غیرهمزمان

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

Protected Sub ArticleGroup_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)

  LblFinalResult.Text = Maghalat.GetNumberOfMaghalat(ArticleGroup.SelectedValue)
  LblFinalResult.Text += "   "
 
LblFinalResult.Text += "مقاله تاکنون در گروه "
 
LblFinalResult.Text += "   "
 
LblFinalResult.Text += ArticleGroup.SelectedValue
  LblFinalResult.Text += "   "
 
LblFinalResult.Text += "برروی سایت سخا روش منشتر شده است "
 
System.Threading.Thread.Sleep(2000)

End Sub

توجه داشته باشید که نمی بایست از متد Sleep در کد تولید شده نهائی استفاده کرد . در مثال فوق با فرض این که برنامه بر روی یک ماشین محلی اجراء شده است و هدف مشاهده عملکرد کنترل UpdateProgress است ، از کنترل فوق استفاده شده است .

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

Ajax : تحولی بزرگ در عرصه وب ( بخش ششم )

Ajax : تحولی بزرگ در عرصه وب ( بخش ششم )

آنچه تاكنون گفته شده است :

در بخش پنجم ضمن اشاره به ضرورت استفاده از يك فريمورك در برنامه های وب مبتنی بر Ajax ، با عناصر موجود در سمت سرويس دهنده و سرويس گيرنده  فريمورك ASP.NET AJAX آشنا شديم . در این بخش با نحوه تعامل اين عناصر در جهت تامين خواسته پياده كنندگان برنامه های وب آشنا خواهيم شد . بدين منظور به بررسی دو سناريوی مختلف خواهيم پرداخت : مدل پياده سازی با محوريت سرويس گيرنده  و مدل پياده سازی با محوريت سرويس دهنده .

طراحی انعطاف پذیر معماری ASP. NET Ajax ، دو رویکرد و یا مدل پیاده سازی مختلف را ارائه می نماید . به اولین سناریو که در سمت سرویس گیرنده پیاده سازی می گردد ، "مدل پیاده سازی با محوریت سرویس گیرنده" و به دومين رويكرد که مبتنی بر سرويس دهنده است ، "مدل پياده سازی با محوريت سرويس دهنده " گفته می شود .
قبل از هر چيز لازم است با نحوه عملکرد هر یک از مدل های فوق بیشتر آشنا شویم تا بتوانیم از هر یک در زمان مناسب استفاده کنیم .

مدل پياده سازی با محوريت سرويس گيرنده
در این مدل ، لايه Presentation متاثر از اسكريپت های سمت سرويس گيرنده با بکارگیری DHTML و جاوا اسکریپت است. این بدان معنی است که یک برنامه با هوشمندی و تعامل بیشتر  ،  از طریق سرویس دهنده برای سرویس گیرنده ارسال می گردد ( در زمان استقرار صفحه در حافظه برای مرتبه اول ) . پس از آن ، تعامل بین برنامه مرورگر و سرویس دهنده محدود به بازیابی داده مورد نیاز جهت بهنگام سازی صفحه است . در این مدل کاربران با برنامه تعامل زیادی خواهند داشت ( برنامه ای که در سمت سرویس گیرنده و در مرورگر کاربر اجراء شده است ) .
شکل 1 ، مدل پیاده سازی با محوریت سرویس گیرنده را نشان می دهد .

مدل پیاده سازی با محوریت سرویس گیرنده
شکل 1 : مدل پیاده سازی با محوریت سرویس گیرنده

مدل فوق برای برنامه هائی که اشتیاق زیادی  به استفاده همه جانبه  از ویژگی های DHTML دارند مناسب تر می باشد ( نظیر برنامه های mashup ).  برنامه های mashup ، برنامه های وبی می باشند که محتویات خود را از بیش از یک منبع خارجی دریافت و  آنها را با یک مکانیزم مطلوب در اختیار کاربران قرار می دهند . سایت  Pageflakes.com یک نمونه در این رابطه است . این نوع سایت ها در تعامل مستمر با کاربر می باشند . با توجه به این که لازم است از یک طرف صفحه سبک و با کارائی مطلوب باشد و از طرف دیگر از منابع سمت سیستم بطور هوشمندانه استفاده گردد ، پیاده سازی این نوع برنامه ها با محوریت سرویس گیرنده ، یک گزینه مطلوب می باشد.

مدل پياده سازی با محوريت سرويس دهنده
در این مدل ، منطق برنامه و اكثر عناصر بخش رابط كاربر بر روی سرويس دهنده باقی می مانند .  در ادامه ، تغییرات مورد نیاز رابط کاربر برای برنامه مرورگر ارسال می گردد ، در مقابل این که تغییرات از طریق اجرای اسکریپت های سمت سرویس گیرنده ایجاد شوند . رویکرد فوق ما را به یاد مدل سنتی صفحات ASP.NET می اندازد . مدلی که بر اساس آن ، سرویس دهنده  بخش رابط کاربر را در هر مرتبه postback ایجاد و آن را برای مرورگر و به منظور تفسیر و نمایش یک صفحه جدید ارسال می نماید .
تفاوت مدل فوق با مدل سنتی صفحات ASP. NET در این است که صرفا" قسمت هائی از بخش رابط کاربر که می بایست تفسیر گردند برای برنامه مرورگر ارسال می شوند ( در مقابل تمام صفحه ) . مهمترین دستاورد رویکرد فوق ، بهبود محسوس میزان تعامل و تاخیر در برنامه های وب است .
شکل 2 ، ماهیت مدل پیاده سازی با محوریت سرویس دهنده را نشان می دهد . 

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

رویکرد فوق برای بسیاری از پیاده کنندگان ASP. NET جالب است . چراکه در این مدل به پیاده کنندگان امکان نگهداری هسته رابط کاربر به همراه منطق برنامه بر روی سرویس دهنده داده می شود .عدم تاثیر پذیری این نوع برنامه ها از عملیاتی نظیر غیرفعال کردن جاوا اسکریپت در مرورگر ، باعث شده است که ادامه حیات و سرویس دهی آنها مستقل از پارامترهای تاثیرگذار در سمت سرویس گیرنده باشد .
در زمان کار با کنترل هائی نظیر GridView و Repeater در ASP. NET ، مدل فوق ساده ترین و مطمئن ترین روش را ارائه می نماید .

اهداف  ASP. NET Ajax  
پس از آشنائی اولیه با معماری و برخی از  ويژگی های  ASP. NET Ajax   ، بد نیست به اهداف و دستاوردهای این فريمورك برای پیاده کنندگان برنامه های وب نیز اشاره ای داشته باشیم .

  •  استفاده ساده ، فريموركی با كارآئی بالا : پیاده کنندگان برنامه های وب تمایل دارند که به سادگی و با صرف وقت اندک بتوانند از پتانسیل های Ajax در برنامه های خود استفاده نمایند . فریمورک ASP. NET Ajax   با ارائه یک کتابخانه قدرتمند در سمت سرویس گیرنده و یک مجموعه از کنترل های سرویس دهنده این امکان را در اختیار پیاده کنندگان برنامه های وب قرار می دهد که بتوانند به سادگی از امکانات فوق در جهت تامین خواسته های خود ( برنامه های گذشته و برنامه های جدید )  استفاده نمایند .

  • یکپارچگی مدل برنامه نویسی سرویس دهنده : کنترل های سرویس دهنده ارائه شده به همراه فریمورک ASP. NET Ajax برای پیاده کنندگان برنامه های وب یک الگوی کاملا" شناخته شده می باشد . چراکه پیش از این پیاده کنندگان از کتترل های سرویس دهند متعددی در برنامه های وب ASP. NET استفاده کرده اند .

  • عناصر و ابزارهائی با کلاس جهانی : عناصر و ابزارهائی که بر روی فریمورک ایجاد شده اند ، نه تنها قابلیت و توانمندهای فریمورک را توسعه داده اند ، بلکه مجموعه ای از ابزارهای قدرتمند  ( نظیر اشکال زدائی ، tracing و profiling )   را در اختیار جامعه بزرگ پیاده کنندگان قرار می دهد .

  • حمایت از پلت فرم های متعدد : حمايت در IE ، فايرفاكس ، Safari و ساير مرورگرها اين اطمينان را ايجاد می نمايد كه در زمان كار با مرورگرهای مختلف درگير مشكلات مربوطه نخواهيم شد .

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

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

Ajax : تحولی بزرگ در عرصه وب ( بخش چهارم )

Ajax : تحولی بزرگ در عرصه وب ( بخش چهارم )

آنچه تاكنون گفته شده است :
در اين بخش قرار بود كه در رابطه با فريمورك های مختلف ارائه شده  جهت بكارگيری فناوری Ajax  آشنا شويم . ولی به دليل درخواست تعداد زيادی از خوانندگان مبنی بر آشنائی بيشتر با معماری Ajax ، برنامه نويسی غيرهمزمان در برنامه های وب و شی XMLHttpRequest  ، اين بخش را به بررسی موارد فوق اختصاص داديم تا علاقه مندان بتوانند قبل از پرداختن به اصل موضوع با برخی مفاهيم كليدی و مهم بيشتر آشنا شوند .

مقدمه
Ajax يك رويكرد و يا الگوی جديد برای پياده سازی برنامه های وب است كه در آن از اسكريپت های سمت سرويس گيرنده برای مبادله داده با سرويس دهنده وب استفاده می گردد. رويكرد فوق باعث می شود كه صفحات وب بدون نياز به refresh كامل بتوانند بطور پويا بهنگام گردند ( رويائی برای پياده كنندگان برنامه های وب ) . مهمترين دستاورد رويكرد فوق ، ارتباط  بدون وقفه و پيوسته كاربران با برنامه های وب است .
برخی از كارشناسان بر اين اعتقاد هستند كه رويكرد فوق بيش از آن كه يك الگو باشد يك فناوری است . در واقع ،  Ajax  تركيبی از  مجموعه فناوری های مرتبط به هم است كه از آنها با يك نگرش جديد در جهت توليد نسل جديدی از برنامه های وب استفاده می گردد . 
نام بردن از فناورهائی كه در Ajax از آنها استفاده می گردد كار مشكلی نيست ولی مهم اين است كه بدانيم اين فناورها در كنار يكديگر به چه صورت كار می كنند و هر يك از آنها در Ajax دارای چه مختصاتی است .شكل 1 ، نحوه تعامل و ارتباط اين فناوری ها را از منظر مرورگر نشان می دهد .

عناصر Ajax
شكل 1 : عناصر Ajax
 

جاوا اسكريپت در Ajax دارای يك نقش محوری و تعيين كننده است و می توان آن را به منزله يك نيروی چسبنده در نظر گرفت كه ساير فناوری ها را با هم مرتبط می نمايد . زمانی كه يك برنامه به داده نياز داشته باشد ، از شی XMLHttpRequest به منظور ايجاد درخواست به سرويس دهنده استفاده می گردد . پس از برگرداندن داده توسط سرويس دهنده ، از فناورهای DOM  ( برگرفته شده از Document Object Model )  و CSS ( برگرفته شده از cascading style sheets  )  برای بهنگام سازی رابط كاربر مرورگر به صورت پويا استفاده می گردد .

برنامه نويسی وب غيرهمزمان 
حرف A موجود در Ajax از  Asynchronous گرفته شده است كه در زبان فارسی به غيرهمزمان و يا ناهمگام ترجمه می شود و بيانگر يكی از قابليت های مهم و كليدی الگوی برنامه نويسی Ajax است .  
در برنامه های وب سنتی ، تعامل كاربر با برنامه بطور پيوسته نبوده و در مقاطع زمانی خاصی لازم است كاربر در انتظار اتمام يك عمليات باشد . زمانی كه كاربر عمليات خاصی نظير كليك بر روی دكمه موجود بر روی يك فرم را انجام می دهد ، يك درخواست مبتنی بر پروتكل HTTP برای سرويس دهنده وب ارسال می گردد . در ادامه ، سرويس دهنده درخواست را پردازش ( به عنوان نمونه ، انجام برخی محاسبات و يا عمليات مرتبط با بانك های اطلاعاتی ) و نتايج توليد شده را در قالب يك صفحه وب با محتويات جديد برای سرويس گيرنده ارسال می نمايد .
نحوه عملكرد صفحات وب متاثر از ماهيت stateless بودن پروتكل HTTP است . با توجه به اين كه تمامی منطق برنامه معمولا" بر روی سرويس دهنده قرار می گيرد  ، نقش مرورگرها صرفا" نمايش بخش رابط كاربر و يا اصطلاحا" اينترفيس برنامه است . سرويس دهنده ، چرخه حيات يك صفحه وب را بطور كامل طی می نمايد و برای مرورگر تگ های HTML ، كدهای CSS  و ساير منابع مورد نياز را جهت بازخوانی و نمايش مجدد صفحه ارسال می نمايد . ماهيت فرآيند فوق بگونه ای است كه در دراز مدت نمی تواند رضايت خاطر كامل كاربران را  حداقل در سطح بخش رابط كاربر برنامه تامين نمايد . در اين مدل كاربران از يك الگوی  stop-start-stop تبعيت می نمايند . كاربران در برخی موارد و با توجه به شرايط حاكم بر برنامه بطور موقت و از روی ناچار ارتباط خود را با برنامه از دست داده و می بايست در انتظار بهنگام سازی صفحه وب درخواستی بمانند .
شكل 2 ، نحوه عملكرد برنامه های وب در يك فرآيند همزمان را نشان می دهد .


نحوه عملكرد برنامه های وب در يك فرآيند همزمان
شكل 2 : نحوه عملكرد برنامه های وب در يك فرآيند همزمان
( عدم تعامل كاربر با برنامه در زمان درخواست های HTTP )

در ASP.NET زمانی كه يك صفحه داده را برای خود و يا حتی صفحه ای ديگر ارسال می نمايد ، يك postback اتفاق می افتد . در حين اين فرآيند ، وضعيت جاری صفحه به همراه كنترل های موجود بر روی آن جهت پردازش برای سرويس دهنده ارسال می گردند . مكانيزم postback  با هدف تامين خواسته هائی نظير  نگهداشت وضعيت صفحه و كنترل های سرويس دهنده موجود بر روی آن دنبال می شود . فرآيند فوق گرچه در نهايت می تواند منجر به refresh صفحه وب و نمايش محتويات جديد برای كاربر گردد ولی هزينه انجام آن زياد خواهد بود چراكه اولا" يك حجم داده می بايست برای سرويس دهنده ارسال گردد و ثانيا" ارتباط منطقی كاربر با برنامه از بين خواهد رفت .

يك برنامه وب مبتنی بر Ajax با مدل و يا رويكردی متفاوت نسبت به آنچه اشاره گرديد ، كار می كند . در اين مدل ،  تعامل مستمر كاربر با برنامه  از طريق معرفی يك نماينده كه بين سرويس گيرنده و سرويس دهنده قرار می گيرد ، تامين می گردد . اين نماينده و يا agent ، با سرويس دهنده بطور غيرهمزمان ارتباط برقرار می نمايد ( از طرف سرويس گيرنده ) تا درخواست HTTP را ايجاد و آن را برای سرويس دهنده ارسال نمايد . وظايف نماينده فوق به اين نقطه ختم نمی گردد و مسئوليت بهنگام سازی صفحه پس از دريافت داده از سرويس دهنده نيز بر عهده وی می باشد .
در مدل غير همزمان ، Ajax engine توسط جاوا اسكريپت فراخوانده می شود تا داده مورد نظر را درخواست  نمايد . پس  ايجاد درخواست توسط Ajax engine و ارسال آن برای سرويس دهنده  و انجام پردازش های ضروری در سمت سرويس دهنده ، نتايج توسط Ajax engine دريافت و  بخش رابط كاربر برنامه متناسب با آن بهنگام می گردد .
شكل 3 ، نحوه عملكرد برنامه های وب در يك فرآيند غيرهمزمان را نشان می دهد .

نحوه عملكرد برنامه های وب در يك فرآيند غيرهمزمان
شكل 3 : نحوه عملكرد برنامه های وب در يك فرآيند غيرهمزمان
(ارسال درخواست های HTTP از طريق Ajax engine برای سرويس دهنده)

در هسته Ajax engine ، شی مهم و كليدی  XMLHttpRequest قرار دارد كه در ادامه با  آن بيشتر آشنا می شويم .

شی XMLHttpRequest
شی ‌  XMLHttpRequest  به منزله قلب برنامه نويسی Ajax مطرح می گردد چراكه شی فوق باعث می شود جاوا اسكريپت بتواند درخواست هائی را ايجاد تا برای سرويس دهنده ارسال و نتايج ارسالی از سرويس دهنده را نيز پردازش نمايد .
شی فوق اولين مرتبه و به صورت يك شی اكتيوايكس در Internet Explorer 5 عرضه گرديد و هم اينك از آن در  اكثر مرورگرها حمايت می گردد . ساير مرورگرها نظير Safari  ، Opera ، Mozilla و فايرفاكس پتانسيل های XMLHttpRequest  را به صورت يك شی ذاتی جاوا اسكريپت ارائه كرده اند ( در  IE 7.0 شی فوق بطور ذاتی در جاوا اسكريپت تعبيه شده است ) .
با توجه به اين كه تاكنون نسخه های مختلفی از شی فوق در مرورگرها پياده سازی شده است ، پياده كنندگان می بايست كد لازم به منظور تشخيص  نوع شی فوق را در زمان ايجاد يك نمونه از آن را در برنامه خود پيش بينی نمايند . برای تعيين نسخه در دسترس شی XMLHttpRequest می توان از روشی موسوم به " تشخيص شی " استفاده كرد .

ايجاد يك نمونه از شی XMLHttpRequest با توجه به نوع مرورگر

 var xmlHttp = null;
  if (window.XMLHttpRequest)     {     //IE7 , Mozilla  ,...
            xmlHttp = new XMLHttpRequest(); 
   } else if (window.ActiveXObject) {
       try{
           xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); //IE 5.x, 6
        }
  catch(e) {}
 }

مثال
برای آشنائی با نحوه عملكرد شی فوق و برنامه نويسی وب غيرهمزمان ، در ادامه به بررسی يك نمونه مثال ساده خواهيم پرداخت . فرض كنيد قصد داريم يك درخواست غيرهمزمان به يك منبع موجود بر روی سرويس دهنده (در اين مثال خاص يك صفحه  html كه حاوی يك متن ساده است  ، صفحه  ArticleSummery.htm  ) را ايجاد نمائيم . صفحه فوق يك صفحه وب با حداقل اطلاعات و شامل يك متن ايستا است .

صفحه ArticleSummery.htm

<html xmlns="http://www.w3.org/1999/xhtml" dir="rtl">
<
head>
   <meta content="text/html; charset=utf-8" http-equiv="content-type" />
   <title>تست برنامه نويسی وب غيرهمزمان title>
head>
<
body style="font-family: Tahoma;">
  <div>در اين مقاله با برنامه نويسی وب همزمان و غيرهمزمان آشنا شديم div>
body>
html>

 مسئوليت ارسال يك درخواست غيرهمزمان به تابع SendRequest سپرده شده است .

  ارسال يك درخواست غيرهمزمان

كد

مرحله

  function sendRequest(url) {
  if (xmlHttp) {
       xmlHttp.open("GET", url, true); // true = async

1

 فعال كردن ارتباط غيرهمزمان

 
       xmlHttp.onreadystatechange = onCallback;
   

2

نسبت دهی تابع callback

 
      xmlHttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
 
       xmlHttp.send(null);
     }
  }

3

 ارسال درخواست غيرهمزمان

توضيحات

  • متد sendRequest ،‌ يك پارامتر كه در واقع URL مربوطه به درخواست HTTP است را دريافت می نمايد .

  • مرحله اول : يك ارتباط غيرهمزمان ايجاد می گردد ( در نظر گرفتن مقدار true به عنوان سومين پارامتر در زمان فعال كردن ارتباط نشان دهنده يك ارتباط غيرهمزمان است ).

  • مرحله دوم : پس از مقداردهی اوليه ارتباط مورد نظر ، به خصلت onreadystatechange شی XMLHttpRequest يك تابع محلی با نام onCallback نسبت داده می شود . توجه داشته باشيد كه فراخوانی تابع فوق به صورت غيرهمزمان است . تابع Callback مشخص می نمايد كه چه زمانی درخواست تكميل و يا بهنگام شده است .

  • مرحله سوم : پس از مشخص كردن نوع محتوا در هدر درخواست ، با استفاده از متد Send شی XMLHttpRequest  ، درخواست HTTP برای سرويس دهنده ارسال می گردد .

 فراخوانی تابع  onCallback
هر مرتبه ای كه وضعيت ready تغيير می يابد ، از تابع callback جهت ايجاد يك درخواست غيرهمزمان استفاده می گردد . در مرحله نهائی ، وضعيت بررسی و بخش رابط كاربر به همراه محتويات برگردانده شده از صفحه ArticleSummery.htm ، بهنگام می گردد. 

فراخوانی تابع oncallback

كد

مرحله

     function onCallback() {
       if (xmlHttp.readyState == 4) {

1

 بررسی تكميل عمليات

 
        if (xmlHttp.status == 200){

2

مقدار 200 نشان دهنده انجام موفقيت آميز عمليات است

 
      var r = document.getElementById('results');
       r.innerHTML = xmlHttp.responseText;
}
 

3

 نمايش نتايج

   else {
  alert('Error: ' + xmlHttp.status);
}

توضيحات

  • وضعيت درخواست از طريق خصلت readyState برگردانده می شود .

  • مرحله اول : در صورتی كه مقدار خصلت readyState شی XMLHttpRequest برابر با مقدار 4 باشد ، درخواست به اتمام رسيده است .  

  • مرحله دوم : در ادامه ، پاسخ برگردانده شده از سرويس دهنده بررسی می شود تا اين اطمينان حاصل گردد كه همه چيز با موفقيت انجام شده است .مقدار كد وضعيت 200 مربوط به پروتكل HTTP  ،  نشان دهنده اين موضوع است كه درخواست با موفقيت انجام شده است .

  • مرحله سوم :  در نهايت  ،  خصلت  innerHTML مربوط به عنصر span متاثر از محتويات برگردانده شده ، بهنگام می گردد .

كد زير ، محتويات صفحه Ajax1.aspx را بطور كامل نشان می دهد .

صفحه   Ajax1.aspx

<%@ Page Language="VB" Culture="fa-IR" %>
<script runat="server">
script>
<
html xmlns="http://www.w3.org/1999/xhtml" dir="rtl" >
      <
head id="Head1" runat="server">
             <
title>نحوه استفاده از شی XMLHttpRequesttitle>
      head>
 <
body style="font-family: Tahoma">
  <form id="form1" runat="server">
     <div>
 
      <span id="results">بارگذاری صفحه ...span>
     div>
  form>
<
script type="text/javascript">
   var
xmlHttp = null;
   window.onload =
function() {
   loadXmlHttp();
   sendRequest(
"ArticleSummery.htm");
 }
 function loadXmlHttp() {
  
if (window.XMLHttpRequest) { // IE7, Mozilla, Safari, Opera, etc.
   xmlHttp = new XMLHttpRequest();
   }
else if (window.ActiveXObject) {
  
try{
    xmlHttp =
new ActiveXObject("Microsoft.XMLHTTP"); // IE 5.x and 6
  }
catch (e){}
  }
 }
 function sendRequest(url) {
 
if (xmlHttp) {
 
  xmlHttp.open("GET", url, true); // true = async
 
  xmlHttp.onreadystatechange = onCallback;
 
  xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
 
// Send request without any additional parameters
  xmlHttp.send(null);
  }
}
function onCallback() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200){
var r = document.getElementById('results');
r.innerHTML = xmlHttp.responseText;
 }
else {   // HTTP error
  alert(
'Error: ' + xmlHttp.status);
   }
 }
}
 script>
 body>
html>

شكل  4 خروجی مثال فوق را نشان می دهد .

 ايجاد يك درخواست Http غيرهمزمان توسط شی XMLHttpRequest
شكل 4 : ايجاد يك درخواست Http غيرهمزمان توسط شی XMLHttpRequest

در اين مثال با نحوه ايجاد يك درخواست HTTP غيرهمزمان توسط شی  XMLHttpRequest به صفحه ديگر موجود بر روی سرويس دهنده آشنا شديم . پس از اتمام درخواست ، كاربران صفحه نهائی را كه محتويات عناصر رابط كاربر موجود در آن (يك span ) به صورت پويا بهنگام شده اند ، مشاهده خواهند كرد .

خلاصه
در اين مقاله با برنامه نويسی وب همزمان و غيرهمزمان و نحوه عملكرد شی  XMLHttpRequest آشنا شديم . هدف از بيان موارد فوق ، صرفا" آشنائی  با الگوی برنامه نويسی وب مبتنی بر Ajax بود . تمامی داستان به اين نقطه ختم نمی شود و در مقالات آتی به ساير پتانسيل های Ajax به منظور پياده سازی برنامه های وب اشاره خواهيم كرد .

منبع : http://www.srco.ir/Articles/DocView.asp?ID=558

Ajax : تحولی بزرگ در عرصه وب ( بخش سوم )

Ajax : تحولی بزرگ در عرصه وب ( بخش سوم )

در بخش اول  ضمن بررسی تاثير متقابل وب بر نرم افزار ، مروری داشتيم به وب ايستا و وب پويا و اين كه برای انجام پردازش های مورد نياز در برنامه های وب می توان از امكانات و فناوری های متعددی در سمت سرويس گيرنده و سرويس دهنده استفاده كرد . هدف از بيان مطالب فوق ، پاسخ به اين سوال بود كه چرا به وجود يك فناوری ديگر نظير Ajax نياز است ( گرچه  Ajax يك فناوری نيست و مجموعه ای از فناوری ها را شامل می شود ) .
در بخش دوم با Ajax و فناوری های مرتبط با آشنا شديم . در اين بخش به بررسی نمونه برنامه هائی خواهيم پرداخت كه در آنها از فناوری Ajax استفاده می گردد . 

Google Suggest
اجازه دهيد كار خود را با نمونه ای آغاز نمائيم كه برای شما كاملا" آشنا است . در زمان استفاده از اينترنت هر يك از ما بدفعات از موتورهای جستجو  جهت يافتن اطلاعات مورد نياز حود استفاده می كنيم . Google يكی از محبوبترين و قدرتمندترين موتورهای جستجو  در اينترنت است . پس از تايپ كليد واژه مورد نظر و فشردن كليد  Google Search ، كليد واژه مورد نظر برای سرويس دهنده ارسال می گردد . در ادامه ،‌ با توجه به ايجاد زيرساخت اطلاعاتی لازم در سمت سرويس دهنده ، نتايج استخراج و برای شما ارسال می گردد .
 Google Suggest ، يكی از اولين نمونه برنامه هائی است كه در آن از Ajax استفاده شده است .برنامه فوق دارای اينترفيسی مشابه صفحه اصلی گوگل است ( يك text box جهت تايپ كليد واژه مورد نظر به همراه يك button جهت جستجو ) . همه چيز مشابه صفحه اصلی و قديمی گوگل است تا زمانی كه شروع به تايپ متن مورد نظر خود در text box نكرده ايد . به موازات تايپ متن در محل مربوطه ، گوگل پيشنهادات و يا اطلاعاتی را از سرويس دهنده دريافت و به شما ارائه می نمايد ( يك ليست از واژه ها به همراه  تعداد نتايج مربوط به هر يك ) .
به عنوان نمونه فرض كنيد عبارت srco.ir را در بخش مربوطه تاپپ نمائيم ، به موازات تايپ هر يك از حروف ، گوگل پيشنهادات خود را ارائه می نمايد . نحوه عملكرد Google Suggest  در شكل 1 نشان داده شده است .

  عملكرد برنامه Google Suggest
شكل 1 : عملكرد برنامه Google Suggest  

Gollum
يكی از متداولترين موارد استفاده از Ajax ، ايجاد live search است . Google Suggest كه در بخش قبل به آن اشاره گرديد ، يك نمونه متداول در اين زمينه است . تاكنون تعداد زيادی از اينگونه برنامه ها پياده سازی شده است . به عنوان مثال می توان به برنامه Gollum اشاره كرد ، كه يك live search برای Wikipedia ( بزرگترين دايره المعارف موجود در اينترنت )  را ارائه می نمايد . نحوه عملكرد اين برنامه در شكل 2 نشان داده شده است .

عملكرد برنامه Gollum با هدف جستجو در Wikipedia
شكل 2 : عملكرد برنامه Gollum با هدف جستجو در Wikipedia 


ايجاد يك ماشين حساب مبتنی بر Ajax
هر برنامه ای كه در آن لازم است داده برای سرويس دهنده ارسال تا پس از انجام پردازش های لازم در سمت سرويس دهنده ، نتايج برای سرويس گيرنده برگردانده شود ، می تواند شرايط اوليه مورد نياز  جهت  استفاده از فناوری Ajax را دارا باشد . پياده سازی يك ماشين حساب ساده يك نمونه در اين زمينه است .
برای استفاده از ماشين حساب فوق ، كاف‍ی است دو عدد ( و يا اپراند ) را در فيلدهای مربوطه درج و در ادامه  بر روی دكمه عملگر ( جمع ، تفريق ، ضرب ، تقسيم ) مورد نظر كليك نمائيم . برنامه فوق با استفاده از Ajax ، اطلاعات خود را ( شامل اپراندها و نوع عملگر انتخابی ) برای سرويس دهنده ارسال می نمايد تا پس از انجام عمليات ، نتايج برای سرويس گيرنده برگردانده شود . تمامی عمليات بدون نياز به refresh صفحه انجام می شود . عملكرد برنامه فوق از منظر كاربر ،‌ شباهت بسيار زيادی به برنامه های desktop دارد.
شكل 3 ، نحوه عملكرد برنامه فوق را نشان می دهد .

يك ماشين حساب ساده مبتنی بر فناوری Ajax
شكل 3 : يك ماشين حساب ساده مبتنی بر فناوری Ajax

 
 برنامه های chat
Ajax در هر مكانی كه به بهنگام سازی سنگين داده نياز باشد ، می تواند كارآئی فوق العاده ای داشته باشد . برنامه های چت يك نمونه متداول در اين زمينه می باشند . در اين نوع برنامه ها ، هر يك از كاربران متن مورد نظر خود را تايپ و بلافاصله متن تايپ شده برای كاربرانی كه به سيستم log in كرده اند ، نمايش داده می شود . Ajax يك گزينه مناسب برای اين نوع برنامه ها می باشد ، چراكه متن نمايش داده شده همواره بهنگام شده است . با استفاده از Ajax می توان متن را به سادگی در هر محلی از صفحه بهنگام كرد ( بدون اين كه به refresh نياز باشد ) .
 PHP Free Chat ،  يك نمونه از اين نوع برنامه های چت است . برنامه فوق با اتصال به سرويس دهنده پتانسيل های مورد نياز يك برنامه چت را در اختيار كاربران قرار می دهد . پس از درج يك نام می توان به برنامه وارد شد . پس از تايپ متن مورد نظر و فشردن دكمه enter ، متن تايپ شده با استفاده از Ajax برای سرويس دهنده ارسال می گردد . در ادامه ، متن فوق به همراه ساير متون تايپ شده توسط كاربران در chat box نمايش داده می شود . شكل 4 ، نحوه عملكرد برنامه فوق را نشان می دهد .

يك برنامه چت مبتنی بر فناوری Ajax
شكل 4 : يك برنامه چت مبتنی بر فناوری Ajax

پردازش بر روی صفحات گسترده
يكی ديگر از كاربردهای متداول Ajax استفاده از آن در برنامه های صفحه گسترده و يا همان spreadsheet است . برنامه Num Sum يك نمونه در اين زمينه است . با استفاده از برنامه فوق می توان يك صفحه گسترده واقعی ( بكارگيری فرمول ها و ذخيره آن بر روی سرويس دهنده مورد نظر )  را ايجاد كرد . به موازات درج داده ، فرآيند بهنگام سازی بدون نياز به انجام يك refresh توسط مرورگر انجام خواهد شد . شكل 5 ، نحوه عملكرد برنامه فوق را نشان می دهد .

يك برنامه صفحه گسترده مبتنی بر فناوری Ajax
شكل 5 : يك برنامه صفحه گسترده مبتنی بر فناوری Ajax

استفاده از سايت آمازون
استفاده از محتويات موجود بر روی سايت آمازون ، يك نمونه ديگر از برنامه های وب مبتنی بر فناوری Ajax را نشان می دهد . با استفاده از برنامه فوق می توان تمامی محتويات منتشر شده بر روی سايت آمازون را با يك ساختار درختی مشاهده كرد .با كليك بر روی هر گره می توان محصولات مربوط به آن را مشاهده كرد . شكل 6 ، نحوه عملكرد برنامه فوق را نشان می دهد .

مشاهده محتويات سايت آمازون به كمك يك برنامه وب مبتنی بر فناوری Ajax
شكل 6  : مشاهده محتويات سايت آمازون به كمك يك برنامه وب مبتنی بر فناوری Ajax

log in  توسط Ajax
با استفاده از Ajax می توان فرآيند log in به يك سايت را ساده تر كرد . به عنوان نمونه با مراجعه به آدرس   www.jamesdam.com/ajax_login/login.html   صفحه ای را مشاهده خواهيم كرد كه اجازه log in اتوماتيك را با استفاده از Ajax به كاربران می دهد . در صورتی كه يك نام و رمز عبور صحيح توسط كاربر درج نشود و وی در هر مكانی از صفحه كليك نمايد ، يك پيام خطاء نمايش داده خواهد شد . به عبارت ديگر ، در صورتی كه كاربر  نام و رمز عبور صحيح خود را وارد نمايد و در هر مكانی از صفحه كليك نمايد ، امكان log in به سايت در اختيار وی گذاشته می شود . شكل 7 عملكرد برنامه فوق را نشان می دهد .

فرآيند log in به يك سايت با استفاده از فناوری Ajax
شكل 7 : فرآيند log in به يك سايت با استفاده از فناوری Ajax

Drag و Drop با Ajax
به موازات افزايش چشمگير شباهت برنامه های وب و برنامه های desktop ، هم اينك می توان بسياری از عملياتی را كه در برنامه های desktop انجام می شود در برنامه های وب نيز انجام داد . فرآيند موسوم به drag & drop نمونه ای در اين زمينه است كه بكارگيری آن در برخی برنامه ها می تواند كار را برای كاربران ساده تر نمايد . سرويس دهنده بطور اتوماتيك از آيتم انتخاب شده توسط كاربر آگاه شده و متناسب با آن از خود واكنش نشان خواهد داد . با مراجعه به آدرس  www.broken-notebook.com/magnetic  ، می توان يك نمونه از اين نوع  برنامه ها را مشاهده كرد.
زمانی كه يك magnet را به يك مكان جديد drag می نمائيد ، مكان جديد با استفاده از تكنولوژی Ajax برای سرويس دهنده ارسال و در آن مكان داده ذخيره می گردد . در ادامه ، ساير افرادی كه صفحه فوق را  مشاهده  خواهند كرد ، آن را در موقعيت و يا مكانی خواهند يافت كه قبلا" شما آن را مستقر كرده ايد ، مگر اين كه موقعيت آن توسط ساير كاربران تغيير يافته باشد .  شكل 8 عملكرد برنامه فوق را نشان می دهد .

عمليات Drag & Drop به كمك فناوری Ajax
شكل 8 :  عمليات Drag & Drop به كمك فناوری Ajax

يكی از متداولترين موارد استفاده از عمليات Drag  & Drop به همراه Ajax ، پياده سازی Shopping cart است . زمانی كه خريدار قصد دارد يك آيتم را به يك shopping cart اضافه نمايد ، می بايست كاربر در چندين صفحه حركت نمايد تا در نهايت با كليك بر روی‌ دكمه Add to Cart كالای انتخاب شده را به سبد خريد اضافه نمايد و مجددا" برای دنبال نمودن فرآيند خريد به صفحات قبل برگردد . با استفاده از فناوری Ajax می توان به سادگی كالای مورد نظر خود را انتخاب و در ادامه با عمليات Drag & Drop آن را در سبد خريد قرار داد . زمانی كه با روش Drag  & Drop يك آيتم به يك سبد خريد اضافه  می گردد  ، سرويس دهنده  از اين موضوع مطلع شده و مبلغ كالای خريداری شده را به مجموع كالاهای خريداری شده موجود در سبد خريد اضافه می نمايد .  

 تغيير صفحات وب به صورت پويا 
يكی از حوزه هائی كه Ajax در آن توانمند و حرف های زيادی برای گفتن دارد ، بهنگام سازی و يا تغيير محتويات يك صفحه وب به صورت پويا است . تاكنون هزاران نوع از اين برنامه ها در طی ساليان اخير و به كمك فناوری Ajax پياده سازی شده است .
SaneBull Market Monitor يك نمونه از كاربرد Ajax به منظور تغيير محتويات يك صفحه را نشان می دهد . همزمان با مشاهده صفحه ، اطلاعات مندرج در آن بهنگام و آخرين وضعيت سهام در اختيار مخاطبان قرار داده می شود . شكل 9 ، نحوه عملكرد برنامه فوق را نشان می دهد .

 بهنگام سازی محتويات يك صفحه وب به كمك فناوری Ajax
شكل 9 : بهنگام سازی محتويات يك صفحه وب به كمك فناوری Ajax

 برنامه های واژه پرداز online يكی ديگر از نمونه كاربردهای Ajax در عرصه ارائه سرويس های online می باشند . يكی از اين نوع برنامه ها را می توانيد از طريق آدرس  http://docs.google.com   مشاهده نمائيد . 

تعامل با نقشه ها
Google Map ، يكی از اولين برنامه هائی است كه در آن از  Ajax استفاده شده است  . پس از تمركز بر روی يك نقطه ، اطلاعات آن نقطه خاص از سرويس دهنده بازيابی و با يك فرمت مناسب نمايش داده می شود .  شكل 10 ، نحوه عملكرد برنامه فوق را نشان می دهد .

تعامل با نقشه ها به كمك فناوری Ajax
شكل 10 : تعامل با نقشه ها به كمك فناوری Ajax

تاكنون سايت های متعددی با الهام از Google Maps ايجاد شده اند . يك نمونه آن را  می توانيد در آدرس www.gtraffic.info  مشاهده نمائيد كه در آن  اطلاعات ترافيك حمل و نقل كشور انگلستان در اختيار كاربران قرار داده می شود 
برنامه های نقشه online تنها برنامه های Ajax  نمی باشند كه از Pop-up استفاده نمايند . به عنوان نمونه با مراجعه به آدرس  www.netflix.com/Top100 سايـتی را مشاهده خواهيد كرد كه با قرار گرفتن بر روی عنوان يك فيلم ، اطلاعات مربوط به آن نمايش داده می شود ( بطور اتوماتيك داده  از سرويس دهنده و با استفاده از Ajax بازيابی می گردد و در ادامه در يك pop up نمايش داده می شود ) . 
شكل

E-mail مبتنی بر Ajax
يكی ديگر از موارد استفاده از Ajax ، حمايت آن از برنامه های پست الكترونيكی مبتنی بر مرورگرها است . يك نمونه آن را می توانيد در آدرس http://demo.nextapp.com/Email/app   مشاهده نمائيد .  
مشاهده نامه های الكترونيكی از طريق برنامه های وب مبتنی بر مرورگر دارای چالش های مختص به خود است .  در اين نوع برنامه ها پس از مشاهده ليستی از نامه های دريافتی با كليك بر روی هر يك از آنها به صفحه ای هدايت خواهيم شد كه در آن متن نامه الكترونيكی جهت خواندن در اختيار ما قرار داده می شود . پس از اتمام مطالعه يك نامه ، می بايست جهت مطالعه ساير نامه های دريافتی به  ليست نامه های الكترونيكی  مراجعه كرد .
بكارگيری فناوری Ajax در برنامه های پست الكترونيكی باعث تغيير اساسی رفتار اينگونه برنامه ها شده است . در اين نوع برنامه ها ، پس از مشاهده ليستی از برنامه ها ، با كليك بر روی يك نامه دريافتی بطور اتوماتيك نامه مورد نظر دانلود و برای شما نمايش داده می شود بدون اين كه لازم باشد مرورگر refresh گردد . محتويات نامه دريافتی در انتهای صفحه نمايش داه می شود . شكل 11 ، نحوه عملكرد برنامه فوق را نشان می دهد . 

 يك برنامه وب پست الكترونيكی پياده سازی شده به كمك فناوری Ajax
شكل 11 :‌ يك برنامه وب پست الكترونيكی پياده سازی شده به كمك فناوری Ajax 

 Gmail ، يكی از سرويس های رايگان گوگل است  كه در آن از فناوری Ajax در بخش های متعددی استفاده شده است .  زمانی كه كاربران برای اولين  مرتبه به برنامه فوق log in می نمايند ،  يك engine رابط كاربر درون يك  iframes لود می شود . در ادامه ، تمامی درخواست ها به سرويس دهنده از طريق اين engine و به كمك شی XMLHttp انجام می شود.

انتشار اخبار به كمك  Ajax
 Yahoo! News ، يك نمونه ديگر از بكارگيری فناوری Ajax در مشاهده اخبار را نشان می دهد . پس از استقرار موس بر روی يك عنوان خبری ، خلاصه خبر و يك تصوير مرتبط با آن در يك كادر كوچك نمايش داده می شود . اطلاعات فوق به صورت پويا و به كمك شی  ‌XMLHttp از سرويس دهنده وب بازيابی و نمايش داده می شود . شكل 11 ، نحوه عملكرد برنامه فوق را نشان می دهد . 

 انتشار خبر به كمك فناوری Ajax
شكل 12 :‌  انتشار خبر به كمك فناوری Ajax

خلاصه
با اين كه Ajax دارای عمری كوتاه است ولی در زمانی اندك توانسته است در كانون توجه طراحان و پياده كنندگان برنامه های وب و سرويس های online قرار بگيرد . پياده سازی هزاران برنامه ، دليلی روشن بر موفقيت Ajax  است .  قطعا" در آينده ای نه چندان شاهد حضور موفقيت آميز برنامه های مبتنی بر Ajax در ساير عرصه های فناوری خواهيم بود .
در اين مقاله به ذكر نمونه هائی اندك از كاربرد Ajax در برنامه های وب اشاره گرديد با اين هدف كه بتوان در عمل كارآئی اين فناوری را مشاهده نمود . شناخت منطقی و اصولی هر فناوری به ما كمك خواهد كرد تا از آن به درستی و در جايگاه مناسب استفاده نمائيم . 
در بخش چهارم به بررسی فريمورك های ارائه شده جهت بكارگيری فناوری Ajax خواهيم پرداخت .

Ajax : تحولی بزرگ در عرصه وب ( بخش دوم )

Ajax : تحولی بزرگ در عرصه وب ( بخش دوم )

در بخش اول  ضمن بررسی تاثير متقابل وب بر نرم افزار ، مروری داشتيم به وب ايستا و وب پويا و اين كه برای انجام پردازش های مورد نياز در برنامه های وب می توان از امكانات و فناوری های متعددی در سمت سرويس گيرنده و سرويس دهنده استفاده كرد . هدف از بيان مطالب فوق ، پاسخ به اين سوال بود كه چرا به وجود يك فناوری ديگر نظير Ajax نياز است ( گرچه  Ajax يك فناوری نيست و مجموعه ای از فناوری ها را شامل می شود ) .
با اين كه ايده فناورهائی نظير Ajax  در گذشته نيز وجود داشته است و پياده كنندگان برنامه های وب در زمان خود با بكارگيری برخی فناوری ها و ترفندها  توانسته بودند مشكل خود را تا حدود زيادی برطرف نمايند ولی گذشت زمان و  گسترش باور نكردنی اينترنت ، باعث شد تا استفاده از بستر فوق برای ارائه سرويس های online  در دستور كار اكثر سازمان ها و شركت ها در اقصی نقاط جهان قرار بگيريد . همين موضوع باعث شد كه دگر باره جامعه بزرگ طراحان و پياده كنندگان برنامه های وب اين نياز را احساس كنند كه به يك راه حل جامع و سيستماتيك برای برخورد با مسائل خود ( خصوصا" تعامل با كاربر ) در دنيای نوين برنامه نويسی وب نياز دارند . دنيائی كه در آن دقت و سرعت در ارائه خدمات online با بكارگيری كمترين منابع و توليد بيشترين بهره وری ، رمز ماندگاری يك سازمان در مدار رقابت و پيشرفت است . همين امر باعث شد كه شركت های بزرگ توليد كننده نرم افزار و خدمات online نيز دست به كار شوند و چيزی را خلق كنند كه ما امروزه از آن با نام Ajax ياد می كنيم .
در اين بخش به بررسی موارد زير خواهيم پرداخت :

  • تولد Ajax و ريشه يابی علت انتخاب اين نام
  • Ajax و فناوری های مرتبط با آن
  • اصول حاكم بر فناوری Ajax   .
  • نحوه كاركرد Ajax در برنامه های وب 

تولد Ajax
در فوريه سال 2005 ، Jesse James Garrett از  Adaptive Path مقاله ای را  با عنوان " يك رويكرد جديد به برنامه های وب "   بر روی وب سايت خود منشتر كرد . وی در اين مقاله ضمن اشاره به اين موضوع كه فاصله بين برنامه های وب و desktop در حال از بين رفتن است ،  به بررسی دو نمونه از برنامه های وب جديد با نام Google Suggest و Google Maps پرداخته بود . Garrett  پس از تشريح نحوه عملكرد برنامه های فوق ، برای اولين مرتبه از  واژه  Ajax  در مقاله خود استفاده كرد .
وی در مقاله خود دنيائی را پيش بينی كرده بود كه در آن برنامه های وب از لحاظ قابليت دستيابی ، پاسخ گوئی و سادگی قابل مقايسه با برنامه های desktop خواهند شد . 

 Ajax چيست ؟

  • Ajax برگرفته شده از Asynchronous JavaScript  XML است  و مشتمل بر مجموعه ای از  فناوری ها است ، نه صرفا" يك فناوری .

  • Ajax ، اساس و پايه چيزی است كه امروزه از آن با نام وب 2 نام برده می شود ( نسل جديد وب ) .  ايده اصلی ، ايجاد برنامه های وبی است كه دارای شكل ظاهری و توانمندی هائی  مشابه با برنامه های desktop باشند .

  • Ajax چي‍زی بيشتر از يك نگرش  جديد به برنامه های وب نيست . نگرشی كه در آن صرفا" يك حجم اندك از اطلاعات بين سرويس گيرنده و سرويس دهنده با هدف افزايش تعامل كاربر با برنامه ، مبادله می گردد .

  •  Ajax ، مشتمل بر مجموعه ای از فن آوری ها است كه هر يك دارای جايگاه مختص به خود می باشند :

    - فن آوری های استاندارد presentation نظير XHTML و CSS
    - بهنگام سازی پويای يك صفحه مستقر شده در حافظه با استفاده از DOM ( برگرفته شده از Document Object Model )
    - مبادله و پردازش داده با استفاده از XML (فرمت مبادله داده  ) و XSLT ‌(  تبديل  XML به XHTML  )
    - بازيابی داده غيرهمزمان با استفاده از XMLHttpRequest  ( كارگزار اوليه مبادله اطلاعات  )
    و جاوا اسكريپت كه همه چيز را به يكديگر مرتبط می نمايد و از آن برای برنامه نويسی Ajax engine استفاده می گردد .

  • در دنيای واقعی ، از تمامی فناوری های فوق در Ajax استفاده می گردد  ولی به وجود HTML/XHTML ، DOM و Javascript  بيش از همه نياز است چون :
    از XHTML برای نمايش اطلاعات استفاده می گردد .
    از  DOM برای تغيير بخش هائی از يك صفحه XHTML بدون نياز به load مجدد صفحه استفاده می گردد.
    از جاوا اسكريپت ، برای مقداردهی اوليه ارتباط بين سرويس گيرنده و سرويس دهنده و بهنگام سازی صفحات وب  به كمك  DOM  استفاده می گردد .

  • يك عنصر اساسی و مهم ديگر كه در مقاله  Garrett به آن اشاره نشده است ، ضرورت انجام پردازش های سمت سرويس دهنده است . تمامی فناوری های اشاره شده ( در پاراگراف قبل ) ، در ارتباط مستقيم با Ajax engine سمت سرويس گيرنده می باشند . بدون وجود يك سرويس دهنده مطمئن و پاسخگو به منظور ارسال محتويات برای Ajax engine ، در عمل Ajax فاقد كارآئی لازم خواهد بود . صرفنظر از فناوری استفاده شده در سمت سرويس دهنده ( نظير PHP و يا ASP.NET ) ، می بايست اين اطمينان حاصل گردد كه داده با فرمت صحيح برای Ajax engine ارسال می گردد .

  • از شی XMLHttpRequest درون جاوا اسكريپت برای ارتباط با سرويس دهنده استفاده می گردد تا در ادامه بتوان داده برگردانده شده از سرويس دهنده ( با فرمت Xml و يا متن معمولی ) را پردازش كرد .

  • از DHTML و  CSS برای نمايش نتايج در مرورگر  استفاده می گردد .

  • هدف از كنارهم قرار گرفتن تمامی فناوری های اشاره شده ، اين است كه شكل ظاهری برنامه های وب و نحوه پاسخ گوئی آنها به خواسته كاربران مشابه برنامه های desktop گردد .

همانگونه كه در نام اين فناوری مشخص است ، Ajax مشتمل بر مجموعه ای از فناوری ها است : Asynchronous JavaScript  XML

  • غيرهمزمان و يا  asynchronous  بدين معنی است كه مرورگر لازم نيست منتظر بماند تا داده از سرويس دهنده برگردانده شود و می تواند به محض دريافت داده  آن را پردازش نمايد . به عبارت ديگر ، انتقال داده در پس زمينه انجام شده و مرورگر مجبور به توقف و انتظار برای تحقق اتفاقی نخواهد بود .
    رويكرد فوق نشاندهنده يكی از ويژگی های مهم و حياتی Ajax است . در چنين مواردی‌، می توان داده را پس از ارسال توسط سرويس دهنده ، پردازش كرد . لازم نيست تمامی برنامه را معطل رسيدن داده از سمت سرويس دهنده كرد .
    در صورتی كه لازم است پردازش های سمت سرويس گيرنده منتظر دريافت داده بمانند ، مكانيرم دريافت و پردازش داده می بايست بطور همزمان انجام شود . در صورتی كه يك ارتباط ضعيف بين سرويس گيرنده و سرويس دهنده برقرار شده باشد اين موضوع می تواند عملكرد و موفقيت يك برنامه وب را با مشكل مواجه نمايد . 

  • بخش جاوا اسكريپت واژه Ajax نيز بسيار مهم است چراكه بالفعل شدن پتانسيل های Ajax در مرورگر توسط آن محقق می گردد . Ajax به كمك جاوا اسكريپت با سرويس دهنده ارتباط خود را برقرار می نمايد و در ادامه نيز داده برگردانده شده از سرويس دهنده را پردازش می نمايد . 

  • بخش xml واژه Ajax دارای چه مسئوليتی است ؟  XML به عنوان يك استاندارد جهانی در عرصه وب مطرح است و به كمك آن می توان از يك روش مبتنی بر متن برای مبادله داده در عرصه اينترنت استفاده كرد . يكی از دلايل مهم گسترش xml ، ماهيت مبتنی بر متن آن است . با توجه به اين كه طراحی اينترنت بگونه ای انجام شده بود تا بتواند مستندات مبتنی بر متن نظير اسناد HTML را نمايش دهد ، وجود xml به منزله قلابی است كه می توان آن را دور اينترنت انداخت و به صيد داده پرداخت. داده ئی كه به همراه ساختار خود می تواند امكان پردازش را در ساير سيستم ها فراهم نمايد . به همين دليل است كه برنامه های Ajax بگونه ای نوشته می گردند تا بتوانند بر روی داده برگردانده شده از سرويس دهنده با فرمت xml ، عمليات مورد نظر را انجام دهند . به عبارت ديگر ، پس از برقراری ارتباط با سرويس دهنده ، داده با فرمت xml برگردانده خواهد شد . 
    xml ، صرفا" يكی از روش های برگرداندن داده است و در صورت لزوم می توان از فرمت هائی ديگر نظير متن معمولی نيز استفاده كرد . 

  • در كنار جاوا اسكريپت و XML ، فناوری Ajax با فناوری های ديگری نظير DHTML  و CSS نيز كار می كند . به كمك فناورهای فوق می توان داده موجود در يك صفحه وب را بدون نياز به load تمامی صفحه بهنگام كرد ( صرفا" load بخشی كه ضرورت آن احساس می شود )  . پتانسيل فوق يكی از اهداف و ويژگی های مهم برنامه های وب مبتنی بر فناوری Ajax محسوب می گردد .

  • بخشی از جاوا اسكريپت كه امكان Ajax را ميسر می سازد ، شی XMLHttpRequest است . شی فوق تقريبا" در تمامی مرورگرهای مدرن و پيشرفته از قبل تعبيه شده است . به كمك اين شی امكان اتصال به سرويس دهنده و مديريت داده برگردانده شده از آن در پس زمينه فراهم می گردد .
    اقتدار Ajax نه تنها وابسته به جاوا اسكريپت بلكه مديون شی XMLHttpRequest است . 

اصول Ajax
Ajax هنوز در ابتدای راه است و بسياری از پياده كنندگان با اين پرسش مواجه هستند كه از اين فناوری در چه زمانی و در چه نوع برنامه هائی می توان استفاده كرد . عدم شناخت مناسب از اين فناوری باعث می شود تا از آن در برنامه هائی استفاده گردد كه نه تنها قابليت و يا ويژگی جديدی را به برنامه اضافه نمی نمايد بلكه در بسياری از موارد عدم موفقيت يك برنامه و نارضايتی كاربران آن را به دنبال خواهد داشت . 
زمانی می توان اين ادعا را داشت كه يك برنامه وب مبتنی بر Ajax  در اهداف خود موفق بوده است كه در آن اصول زير رعايت شده باشد .

  • به حداقل رساندن ترافيك : برنامه های Ajax می بايست حتی المقدور حجم اندكی از اطلاعات را برای سرويس دهنده ارسال و يا از آن دريافت نمايند . به عبارت ديگر ، با بكارگيری Ajax  می بايست حجم ترافيك بين سرويس گيرنده و سرويس دهنده كاهش يابد .   

  •  عدم سردرگمی كاربر : برنامه های وب مبتنی بر فناوری Ajax مدل تعامل با كاربر مختلفی را نسبت به برنامه های وب سنتی معرفی كرده اند . در مقابل وب استاندارد ( كليك كن و منتظر باش ) ، برخی برنامه های Ajax از يك رويكرد ديگر برای پياده سازی بخش رابط  كاربر خود نظير drag-and-drop و يا double-clicking  استفاده می نمايند . صرفنظر از نوع مدل انتخاب شده برای پياه سازی تعامل با كاربر ، مهم ارائه امكانات بخش رابط كاربر بگونه ای است كه همواره كاربر در سريع ترين زمان بتواند در خصوص انجام حركت بعدی خود تصميم گيری نمايد .

  • استفاده منطقی از تجارب مثبت گذشته  : وقت خود را بی خودی به ابداع مدل های تعامل با كاربر جديد كه كاربران شما با آنها آشنا نيستند ، هدر ندهيد . استفاده از تجارب برنامه های  وب سنتی و desktop می تواند پياده كنندگان را در طراحی يك مدل مناسب جهت تعامل با كاربر كمك نمايد .

  • اجتناب از بكارگيری عناصر غيرضروری  : از بكارگيری عناصر غير ضروری نظير تكرار انيميشن و بخش هائی نظير blinking page  اجتناب كنيد. بكارگيری اين چنين عناصری باعث می شود تا كاربران در زمان انجام فعاليت های مورد نظر دچار سردرگمی شوند . 

  • قابليت دسترسی و رضايت كاربران : برنامه های Ajax را با در نظر گرفتن رفتار و نوع خواسته كاربران طراحی و پياده سازی نمائيد . برای طراحی و پياده سازی خود را در يك مكان بسته محبوس ننمائيد. در غير اينصورت همواره اين احتمال وجود خواهد داشت كه خواسته برخی از كاربران ناديده گرفته شود . قابليت دسترسی و رضايت كاربران يكی از نكات بسيار مهم در موفقيت يك برنامه كامپيوتری محسوب می گردد .

  • پيشگيری از دانلود تمامی صفحه : تمامی ارتباط با سرويس دهنده پس از مقدار دهی اوليه دانلود صفحه ، می بايست توسط Ajax engine مديريت گردد . عدم مديريت صحيح بر روی فرآيند فوق می تواند بخش رابط كاربر يك برنامه وب را با مشكل اساسی مواجه سازد ( نظير دانلود حجم اندكی از داده در يك مكان و دانلود تمامی صفحه در بخش ديگر ) 

  • توجه  به نياز كاربران قبل از هر چيز : برنامه های Ajax  را قبل از هر چيز  با كاربران خيالی در ذهن طراحی نمائيد . سهولت در انجام عمليات متداول می بايست در دستور كار قرار بگيرد . كمتر در انديشه انجام كارهای تبليغاتی و يا افكت های غيرضروری باشيد . 

نقطه مشترك بين تمامی اصول اشاره شده ،  قابليت استفاده از يك برنامه با حداكثر ظرفيت و رضايتمندی كاربران است . هدف اوليه Ajax ، بهبود و ارتقاء بخش رابط كاربر برنامه ها با هدف رضايتمندی بيشتر كاربران است . 

نحوه كار Ajax
در برنامه های وب سنتی مرورگر مسئوليت مقداردهی اوليه درخواست ها  و پردازش آنها  جهت ارسال به سرويس دهنده وب را برعهده دارد . در مقابل ،  در  Ajax  يك لايه ميانی ( كه Garrett آن را Ajax engine ناميد ) مسئوليت مديريت  ارتباط برقرار شده را برعهده می گيرد .  Ajax engine در واقع يك شی جاوا اسكريپت و يا تابع است و  زمانی كه به اطلاعاتی از سرويس دهنده نياز باشد ،‌  از آن استفاده خواهد شد .
در مقابل برنامه های وب سنتی كه يك لينك به يك منبع ديگر ارائه می گردد ( نظير يك صفحه وب ديگر ) ، در برنامه های وب مبتنی بر Ajax ، هر لينك باعث فراخوانی Ajax engine می گردد كه وظيفه آن زمانبندی و انجام درخواست بطور غيرهمزمان است  .
سرويس دهنده ( كه از لحاظ سنتی  اسناد HTML ، تصاوير ، CSS و جاوا اسكريپت را ارائه می نمايد ) ، بگونه ای پيكربندی می گردد تا داده مورد نياز را در اختيار Ajax Engine قرار دهد. اين داده می تواند متن معمولی ، XML  و يا ساير فرمت های مورد نياز داده باشد. بديهی است در چنين مواردی ، Ajax engine می بايست قادر به خواندن و تفسير داده باشد .
پس از دريافت پاسخ لازم از سرويس دهنده ، Ajax engine عمليات خود را كه اغلب بررسی داده و ايجاد تغييرات لازم در بخش رابط كاربر است ،  آغاز می نمايد .  با توجه به اين كه در فرآيند فوق به اطلاعات كمتری نسبت به برنامه های وب سنتی نياز است ، بخش رابط كاربر با سرعت بيشتری بهنگام می گردد و كاربر قادر به انجام كارهای خود با سرعت بيشتری است .
در شكل  1 ، عملكرد برنامه های وب سنتی نسبت به برنامه های وب مبتنی بر Ajax نشان داده شده است . 

عملكرد برنامه های وب سنتی نسبت به برنامه های وب مبتنی بر Ajax

شكل 1 : عملكرد برنامه های وب سنتی نسبت به برنامه های وب مبتنی بر Ajax
منبع : Adaptive Path

خلاصه
فناوری های مرتبط با Ajax در طی ساليان گذشته  مطرح  و  از آنها در مجموعه ای از نرم افزارها استفاده می گرديد .  Jesse James Garrett در مقاله خود تمامی فناوری های اشاره شده را در زير يك سقف و با نام Ajax  كنار هم قرار داد . با بكارگيری فناوری Ajax در نرم افزارهای برجسته ای نظير Google Suggest در سال 2005 ، Ajax در كانون توجه جهانی  قرار گرفت . وب 2 ، برای نيل به اهداف خود به Ajax دل بسته است و Ajax می تواند تصويری جديد از برنامه های وب را در عرصه اينترنت به نمايش بگذارد .
وجود برخی خصايص خاص در بخش رابط كاربر برنامه های desktop و نحوه تعامل كاربران با اينگونه برنامه ها ، حلقه گمشده ای در برنامه های وب است. حلقه ای كه Ajax سعی دارد خلاء آن را پر كند .  قطعا" در آينده ای نه چندان دور شاهد حضور بيشتر برنامه های وبی خواهيم بود كه دارای شكل ظاهری و عملكردی مشابه (خصوصا" تعامل با كاربر )  با برنامه های desktop می باشند .
شايد روزی فرا رسد كه يكی از واژه های برنامه های desktop و برنامه های وب به نفع ديگری كنار برود و يا هر دو بر يك نام مشترك ديگر به توافق برسند .
در بخش سوم به بررسی نمونه برنامه هائی خواهيم پرداخت كه در آنها از فناوری Ajax استفاده می گردد .

منبع : http://www.srco.ir/Articles/DocView.asp?ID=555

Ajax : تحولی بزرگ در عرصه وب ( بخش اول )

Ajax : تحولی بزرگ در عرصه وب ( بخش اول )

اينترنت و مهمترين سرويس آن وب علاوه بر اين كه حيات بشری را در هزاره سوم دستخوش تحولات فراوانی كرده است ، توانسته است منشاء تحولات گسترده ای در ساير حوزه های فناوری گردد . در واقع ، تحول در زندگی بشريت  مديون پيشرفت در ساير حوزه های فناوری‌ است . يكی از اين حوزه ها ، صنعت نرم افزار است .
برای آشنائی با اين تحول بد نيست مروری سريع داشته باشيم به گذشته وب و نرم افزار تا از اين رهگذر بتوانيم ضرورت ايجاد فناورهای جديدی نظير Ajax ( برگرفته شده از Asynchronous JavaScript And XML ) را بهتر درك كنيم .

مروری بر وب ، نرم افزار و تاثير متقابل آنها بر يكديگر
موجودات جديدی كه ما امروزه آنها را با نام برنامه های وب می شناسيم ، ماحصل تاثير وب بر نرم افزار و رشد رو به فزاينده استفاده از اينترنت در متن زندگی ، ماحصل تاثير نرم افزار بر وب است . اجازه دهيد ببينيم موضوع از كجا و با چه مختصاتی شروع گرديد و هم اينك در چه وضعيتی به سر می بريم .

وب ايستا : زمانی كه تيم . برنرز لی در سال 1990 اولين پيشنهاد خود در رابطه با وب را ارائه كرد ،  ايده كار بسيار ساده بود : ايجاد يك شبكه از اطلاعات متصل شده به يكديگر با استفاده از ابرمتن ها و URIs ( برگرفته شده از  Uniform Resource Identifiers ) . وب در آغاز به عنوان يك رسانه اشتراك اطلاعات مطرح گرديد تا از طريق آن دانشمندان و محققين بتوانند دانش و اطلاعات را بين خود به اشتراك گذاشته و نتايج تحقيقات را با يكديگر مبادله نمايند . ارائه دهند گان با استفاده از يك استاندارد مستند سازی ، اطلاعات خود را تهيه و آنها را به مخاطبان خود ارائه می كردند . در آغاز برای استاندارد مستند سازی از ابزاری كه در آن زمان خود هنوز استاندارد نشده بود استفاده می گرديد . HTML ، ابزاری است كه با بكارگيری مجموعه ای از تگ ها ، استاندارد لازم جهت نمايش يك مستند در نرم افزارهای نمايش دهنده ( مرورگرها )  را فراهم می نمايد . نرم افزارهای نمايش دهنده ، مجهز به مفسرهائی جهت تفسير تگ ها و نمايش اطلاعات موجود در مستند بر اساس تعاريف از قبل تعريف شده شدند . در آن زمان كه به سال های ابتدائی دهه 90 ميلادی برمی گردد ، چيزی با نام برنامه های وب وجود نداشت و وب به عنوان رسانه ای جهت اشتراك و مبادله اطلاعات مطرح بود . تمامی تعاملات در عرصه وب محدود به درخواست يك مستند توسط سرويس گيرنده و ارسال آن توسط سرويس دهنده بود .

وب پويا با تمركز بر روی پردازش های سمت سرويس گيرنده : در ادامه ، نياز به انجام برخی پردازش های اوليه مطرح گرديد . با  توجه به اين كه اينترنت از يك بستر سرويس گيرنده و سرويس دهنده ( client server based) به منظور دريافت درخواست كاربر و پاسخ به آن استفاده می كرد ، طراحان و پياده كنندگان برای تحقق پردازش ها بر روی دو گزينه متمركز شدند : انجام پردازش ها در سمت سرويس گيرنده و  يا سمت سرويس دهنده . در آغاز ، برای انجام پردازش ها بر روی سرويس گيرنده متمركز شدند . با اين هدف كه بتوان پردازش های مورد نياز را ( با حوزه ای كه در آن زمان تعريف شده بود ) ، در سمت سرويس گيرنده انجام داد . برای تحقق خواسته فوق لازم بود كه بستر و ابزارهای لازم در بطن مرورگر ها ايجاد گردد . ظهور فناورهائی نظير Html-DOM ، جاوااسكريپت ، CSS  ( برگرفته شده از  cascading style sheets ) و DHTML  ( برگرفته شده از Dynamic HTML  )  از جمله مهمترين تلاش های انجام گرفته در آن زمان برای تحقق پردازش ها در سمت سرويس گيرنده بود . برای آشنائی بيشتر با تلاش های انجام گرفته در آن زمان بد نيست مروری سريع داشته باشيم به آنچه طی ساليان گذشته در عرصه وب اتفاق افتاده است .

  •  عرضه جاوا اسكريپت : Netscape Navigator اولين مرورگر وبی بود كه پس از طراحی و پياده سازی موفقيت آميز توانست به عنوان كاتاليزوری در رشد وب و عرضه فناوری های مرتبط با آن نقش بسيار مثبتی را ايفاء‌ كند . اغلب سازمان ها و شركت ها از مرورگر فوق به عنوان معيار استاندارد خود برای پياده سازی فناوری های جديد استفاده می كردند . يكی از اين فناوری ها ، جاوا اسكريپت بود . 
    جاو ااسكريپت توسط Brendan Eich از نت اسكيپ ايجاد و  نسخه شماره دو  آن در سال 1995 عرضه گرديد . برای اولين مرتبه ، پياده كنندگان قادر به ايجاد صفحات وبی شدند كه می توانست با كاربر تعامل برخورد نمايد . استفاده از جاوا اسكريپت برای معتبر سازی داده در سمت سرويس گيرنده و حذف برخی مبادلات غيره ضروری بين سرويس گيرنده و سرويس دهنده از جمله مهمترين دستاورد بكارگيری جاوا اسكريپت در آن زمان بود . بدين ترتيب نطفه پردازش های ساده در سمت سرويس گيرنده به كمك جاوا اسكريپت بسته شد . قابليت فوق در زمانی كه اكثر كاربران اينترنت از طريق يك مودم با سرعت 8 . 28 ( Kbps ) به شبكه وصل می شدند ، باعث می شد كه تعداد دفعاتی كه كاربران مجبور به انتظار برای دريافت يك پاسخ از سرويس دهنده باشند ، كاهش يابد . تحول فوق اولين مرحله جدی به سمت رويكرد Ajax در آن زمان بود .

  •  ايجاد فريم :   در نسخه اوليه HTML با هر سند به عنوان يك موجوديت رفتار می شد  تا اين كه در نسخه شماره چهار فريم ها معرفی گرديدند . با استفاده از فريم ها  نمايش يك صفحه وب می توانست مشتمل بر بكارگيری مجموعه ای از ساير صفحات وب باشد . ايده فوق يك اصلاح ساختاری اساسی در خصوص نحوه نمايش يك صفحه وب بود .  Netscape Navigator 2.0 اولين مرورگری بود كه از فريم ها و جاوا اسكريپت حمايت كرد . اين يك مرحله جدی به سمت رشد و توسعه Ajax در آن زمان بود .
    با توجه به اين كه يك فريم ، يك درخواست مجزاء را  برای سرويس دهنده ايجاد می كرد ، قابليت كنترل يك فريم و محتويات آن با استفاده از جاوا اسكريپت دنيای جديدی را پيش روی طراحان و پياده كنندگان صفحات وب قرار داد .

  • روش فريم  مخفی  : به موازات اين كه پياده كنندگان درگير نحوه استفاده از فريم ها شدند  ، يك روش جديد با هدف تسهيل در امر ارتباط بين سرويس گيرنده و سرويس دهنده مطرح گرديد . روش فريم مخفی شامل تنظيم يك frameset با طول و يا عرض صفر پيكسل است كه هدف اساسی آن انجام فرآيند مقداردهی اوليه با سرويس دهنده بود . فريم مخفی شامل يك فرم HTML با فيلدهای خاصی است كه می توانست بطور اتوماتيك توسط جاوا اسكريپت تكميل و برای سرويس دهنده ارسال گردد . زمانی كه فريم از سرويس دهنده مراجعت می كرد ، يك تايع ديگر جاوا اسكريپت فراخوانده می شد تا اعلام نمايد كه داده از سمت سرويس دهنده برگردانده شده است . روش فريم مخفی ، اولين مدل درخواست و پاسخ غيرهمزمان را برای برنامه های وب به ارمغان آورد ( اولين رويكرد به مدل ارتباطی Ajax ) .

  • Dynamic HTML  و DOM  :  تا سال 1996 ، وب يك دنيای ايستا را تجربه می كرد و برای تعامل محدود با كاربر از جاوا اسكريپت و روش فريم های مخفی استفاده می گرديد . همچنان امكان تغيير در محتويات يك صفحه بدون نياز به load مجدد آن از سرويس دهنده وجود نداشت .  در ادامه IE 4.0 ( برگرفته شده از  Internet Explorer  )  توسط شركت مايكروسافت ارائه گرديد . در اين نسخه علاوه بر بكارگيری اكثر فناوری های استفاده شده در Netscape Navigator ، يك ويژگی مهم ديگر با نام DHTML ( برگرفته شده از Dynamic HTML  ) نيز ارائه گرديد . DHTML به پياده كنندگان اجازه می داد تا بتوانند هر بخشی از يك صفحه مستقر شده در حافظه سرويس گيرنده را با استفاده از جاوا اسكريپت تغيير دهند . DHTML به همراه عرضه غيره منتظره CSS ( برگرفته شده از  cascading style sheets ) به وب و نحوه پياده سازی صفحات وب يك نيروی تازه داد. پياده كنندگان توانستند با تركيب DHTML و روش فريم های مخفی هر بخشی از يك صفحه را با استفاده از اطلاعات دريافت شده از سرويس دهنده refresh نمايند . ويژگی فوق در زمان خود توانست يك تحول بزرگ در عرصه وب را ايجاد نمايد .
    در ادامه ،  DOM ( برگرفته شده از  Document Object Model  ) ارائه گرديد . برخلاف DHTML كه صرفا" امكان تغيير بخش هائی خاص از يك صفحه وب را فراهم می كرد ، DOM  دارای يك هدف بلندپروازانه ديگر بود . هدف DOM ارائه يك ساختار برای تمامی صفحه بود . انجام عمليات و يا پردازش بر اساس ساختار فوق ، امكان تغيير يك صفحه را فراهم می آورد . اين مرحله بعدی به سمت Ajax بود .

  • Iframesبا اين كه روش فريم مخفی بطور غيرقابل پيش بينی متداول گرديد ، ولی دارای چالش های مختص به خود بود . افرادی می بايست زمان زيادی را صرف نوشتن يك frameset می كردند تا شرايط استفاده از فريم های مخفی فراهم گردد . زمانی كه عنصر  >  در سال 1997 و به عنوان بخشی از نسخه رسمی HTML 4.0 ارائه گرديد ، يك قدم اساسی ديگر به سمت انقلاب بر روی وب حركت شد .
    در مقابل تعريف frameset ، پياده كنندگان قادر به استفاده از فريم ها در هر مكانی از صفحه شدند . بدين ترتيب پياده كنندگان توانستند از  iframe نامرئی ( با بكارگيری قابليت های CSS ) در يك صفحه استفاده نمايند و شرايط عملياتی لازم جهت مبادله داده بين سرويس گيرنده و سرويس دهنده را فراهم نمايند . زمانی كه نسخه نهائی DOM در IE 5.0 و Netscape 6.0 پياده سازی گرديد ، قابليت ايجاد فريم ها به صورت پويا نيز فراهم گرديد . در چنين حالتی از يك تابع جاوا اسكريپت به منظور ايجاد يك iframe ، ايجاد يك درخواست و دريافت پاسخ ( جملگی بدون نياز به اضافه كردن تگ های HTML اضافه در يك صفحه ) استفاده می گرديد . اين روش معروف به روش iframe مخفی گرديد .

  • XMLHttp  : پياده كنندگان مرورگر شركت مايكروسافت پس از مشاهده عموميت استفاده از روش هائی‌ نظير فريم مخفی و iframe مخفی ، تصميم گرفتند يك ابزار بهتر جهت تعامل بين سرويس دهنده و سرويس گيرنده را ارائه نمايند . اين ابزار به شكل يك اكتيوايكس و با نام  XMLHttp در سال 2001 ارائه گرديد .
    زمانی كه مايكروسافت حمايت خود از XML را از طريق يك كتابخانه با  نام MSXML آغاز كرد ، شی XMLHttp نيز به همراه آن ارائه گرديد .
    با اين كه شی‌ فوق به همراه خود نام XML   را يدك می كشيد ولی چيزی بمراتب بيشتر از روشی برای انجام عمليات بر روی داده XML  بود . شی فوق همانند يك درخواست HTTP بود كه می توانست توسط جاوا اسكريپت كنترل گردد . پياده كنندگان دارای قدرت دستيابی به كدهای وضعيت HTTP و هدر همانند داده برگردانده شده از طريق سرويس دهنده بودند . داده می توانست به صورت XML ساختيافته ، اشياء سريال شده جاوا اسكريپت و يا ساير فرمت های مورد نظر پياده كننده باشد . در مقابل استفاده از فريم های مخفی و يا iframe ، اين امر ميسر گرديد كه به سرويس دهنده از طريق كد و توسط جاوا اسكريپت دستيابی داشت ( مستقل از چرخه load و  reload صفحه ) . شی XMLHttp پس از مدتی به عنوان يك موفقيت بزرگ برای پياده كنندگان مرورگر IE  عرض اندام كرد .
    به موازات متداول شدن شی فوق ، پياده كنندگان در Mozilla نسخه اختصاصی از  XMLHttp را پياده سازی كردند . در مقابل اجازه دستيابی از طريق اكتيو ايكس ، پياده كنندگان موزيلا متدها و خصلت ها را در يك شی ذاتی مرورگر و با نام objectXMLHttpRequest ارائه كردند . پس از اين كه دو مرورگر اصلی در بازار هر يك توانستند به نوعی از XMLHttp حمايت نمايند ، مرورگرهائی ديگر نظير Opera و Safari نيز هر يك به نوعی حمايت خود از شی فوق را اعلام كردند .

بدين ترتيب پياده كنندگان صفحات وب توانستند ، صفحاتی را خلق نمايند كه با تعبيه كدهای مورد نياز در آنها ، امكان پردازش در سمت سرويس گيرنده را فراهم نمايند . انجام پردازش های اوليه نظير تغيير رنگ و شكل ظاهری صفحات ، مديريت عناصر موجود بر روی يك صفحه و تغيير آنها در زمان اجراء  متناسب با عمليات كاربر ، بررسی صحت داده ورودی توسط كاربر در يك فرم ساده اطلاعاتی ، دريافت داده در پس زمينه و عدم نياز به ارسال تمامی صفحه و بهنگام سازی بخش هائی خاص از آن ( با بكارگيری فريم ها ) ، نمونه هائی از تاثير فناوری هائی بود كه توان پردازش در سمت سرويس گيرنده را در اختيار پياده كنندگان قرار می داد .

وب پويا با تمركز بر روی پردازش های سمت سرويس دهنده
همزمان با گسترش اينترنت و  وب ، ايجاد صفحات وب  با محتويات پويا با اتكاء به منابع داده موجود در سمت سرويس دهنده و ساير شرايط تاثير گذار در فرآيند پاسخ به درخواست كاربران مطرح گرديد . همين موضوع باعث شد كه توجه به سرويس دهنده برای انجام برخی پردازش ها  نيز در دستور كار قرار بگيرد . ظهور فناورهائی نظير  ASP ( برگرفته شده از Active Server Page ) و PHP ( برگرفته شده از  Hypertext Preprocessor  ) از اوايل سال 1996 پاسخی به اين نياز بود . از آن زمان به بعد بود كه كم كم واژه برنامه های وب قدم در عرصه نرم افزار گذاشت . اگر به تعاريف آن زمان برگرديم مشاهده می كنيم كه در ابتدا از اين اصطلاح در خصوص صفحات وب پويا استفاده می گرديد .
نگرش جزيره ای به فناورهای مرتبط با برنامه های وب تا اوايل سال 1999 ادامه يافت . تا اين كه شركت های متعددی به فكر ارائه يك پلت فرم با در نظر گرفتن واقعيتی به نام اينترنت افتادند . دات نت ، پلت فرم ارائه شده توسط شركت مايكروسافت يك نمونه در اين زمينه است كه از صدر تا ذيل آن با در نظر گرفتن واقعيتی با نام اينترنت طراحی و پياده سازی شده است .
در اين دوران بود كه به برنامه های وب با يك نگاه جامع تر و سيستماتيك تر نگاه می شد . در طی پنج سال گذشته ، اين نوع برنامه ها توانستند با بكارگيری مجموعه ای از  فناوری ها  منشاء تحولات عمده ای در خصوص بردن اينترنت در متن  زندگی (و نه حاشيه ! ) مردم جهان باشند . ايده " نرم افزار به عنوان سرويس " و يا برنامه نويسی سرويس گراء از نگرش های جديد به مقوله نرم افزار و دنيای برنامه نويس‍ی در عرصه وب است .
موج استفاده از اينترنت برای ارائه خدمات online ( ارائه شده به كاربران از طريق برنامه های وب )  باعث گرديد تا معماری و رفتار اينگونه برنامه ها با تامل بيشتر مطالعه و بررسی گردد . هدف ، ايجاد برنامه های وب با كارآئی مطلوب است تا ضمن ارائه خدمات خود دارای ويژگی هائی نظير : افزايش تعامل كاربر با برنامه ( همانند برنامه های desktop ) ، استفاده بهينه از محيط انتقال و به حداقل رساندن ترافيك آن ، مديريت بهينه منابع سمت سرويس گيرنده در پاسخ به رويدادهای محقق شده سمت سرويس گيرنده ، عدم ارسال اطلاعات غيره ضروری توسط سرويس گيرنده و ... باشند .  ماحصل اين تفكرات ظهور فناوری جديدی با نام Ajax است كه شركت هائی نظير گوگل و مايكروسافت توانستند از سال 2005 با بكارگيری اين فناوری تحول بزرگی را در عرصه برخی از سرويس ها و خدمات خود ايجاد نمايند .

حمع بندی !
همزمان با بحث معماری سرويس گيرنده و سرويس دهنده  دو واژه   fat-client و thin-client  قدم در ادبيات نرم افزار گذاشتند . در معماری فوق ، هدف استفاده از توان پردازشی سرويس گيرنده و سرويس دهنده برای اجرای يك برنامه است . استفاده از توان پردازشی هر يك از عناصر اصلی درگير در معماری فوق و تعريف سهمی خاص برای هر يك  ( سرويس گيرنده و سرويس دهنده ) ، از اهداف اوليه و در عين حال بسيار مهم معماری فوق است .
پياده كنندگان برنامه های كامپيوتری خصوصا" برنامه های وب ، همواره با اين سوال مواجه بوده و هستند كه در تقسيم سهم پردازش ، چه ميزان سهم را می بايست به سرويس گيرنده داد ؟ چه پردازش هائی را می توان در سمت سرويس گيرنده انجام داد ؟ در پاسخ به اين سوال رويكردهای مختلفی مطرح شده است . fat client و thin client دو نمونه متداول در اين زمينه می باشند .
در   fat client ، هدف بكارگيری پتانسيل های  مرورگر برای انجام اكثر پردازش ها در يك برنامه وب است . رويكرد فوق در اواسط دهه 90 ميلادی در كانون توجه طراحان و پياده كنندگان وب قرار گرفت . علت اين امر به تلاش شركت های بزرگ نرم افزاری در جهت توليد و ارائه فناورهائی بود كه توانمندی مرورگر  در انجام پردازش  را افزايش می داد . ظهور فناورهائی نظير جاوا اسكريپت ، ايجاد يك اينترفيس برنامه نويسی در مرورگر ،‌ايجاد يك مدل شی گراء ( ولو ناقص ) برای يك سند HTML با هدف امكان دستيابی به هر يك از عناصر موجود در آن ، عرضه DHTML و CSS جملگی نشاندهنده تلاش هائی است كه در آن زمان با هدف افزايش توان پردازش در سمت سرويس گيرنده مطرح شد .
پس از گذشت مدت زمان كوتاهی ( از ابتدای سال 1996 ) ، تمايل به سمت برنامه های وب با ويژگی thin client مطرح گرديد . در مدل فوق ، هدف كاهش سهم پردازش در سمت سرويس گيرنده و افزايش پردازش های سمت سرويس دهنده بود . ظهور فناورهای متعددی نظير ASP   و PHP   تنها نمونه ای اندك از تلاش های انجام يافته در آن دوران برای افزايش توان پردازش در سمت سرويس دهنده است .
با اين كه در ساليان گذشته همچنان از پتانسيل های سمت سرويس گيرنده برای انجام پردازش در برنامه های وب استفاده می گرديد ، ولی رفتار اكثر برنامه های وب    مبتنی بر اين واقعيت بود كه : " داده را وارد نمائيد ، صفحه را برای سرويس دهنده ارسال نمائيد و منتظر دريافت پاسخ باشيد " .
هم اينك ما شاهد يك تحول بزرگ ديگر در عرصه برنامه نويسی هستيم . تحولی كه مهمترين دستاورد آن ، تولد نسل جديدی از برنامه های وب است كه در آنها كاربر با برنامه دارای تعامل بمراتب بيشتری نسبت به نسل گذشته برنامه های وب است . اين تحول عظيم نرم افزاری به كمك مجموعه ای از فن آوری ها كه در مجموع به آنها Ajax گفته می شود ، محقق می گردد .
آيا Ajax قصد دارد با تغيير در الگوی رفتاری برنامه های وب فاصله آنها را با برنامه های desktop كاهش دهد ؟  آيا زمان آن رسيده است كه برای پردازش های سمت سرويس گيرنده از يك پلت فرم جامع ، همانند پلت فرم های ارائه شده سمت سرويس دهنده ، استفاده گردد ؟ آيا تاكنون از اين فناوری به منظور ايجاد برنامه های وب  استفاده شده است ؟  با استفاده از چه مكانيزم هائی می توان مبادله اطلاعات بين سرويس گيرنده و سرويس دهنده را كاهش و از پهنای باند موجود استفاده بهينه كرد ؟
اجازه دهيد به اين سوال و سوالات بسيار ديگر در رابطه با Ajax ، فناورهای مرتبط با آن و از همه مهمتر كاربرد آن در بخش های بعدی پاسخ دهيم .

منبع : http://www.srco.ir/Articles/DocView.asp?ID=554

ASP.NET, HTML, JavaScript Snippet Support (VS 2010 and .NET 4.0 Series)

در این پست یکی دیگر قابلیت های مفید visual studio 2010  را مورد بررسی قرار می دهیم .

HTML/ASP.NET/JavaScript snippet support

snippets به شما این امکان را می دهد تا تمام کد های منبع را به صورت پیشگو برای شما تکمیل کند تا شما وقت کمتری را صرف تایپ کردن کنید .

ویژوال استودیو از این قابلیت در کد های VB و #C پشتیبانی می کرد اما در کد Html و javaScript این گونه نبود .


ادامه نوشته