آموزش نکات کاربردی 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

.

آموزش 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 است .

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

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


دستیابی به History در فایرفاکس

تاریخچه در فایر فاکس در فایلی با فرمت دیتا بیس SQLite ذخیره شده است . حتی cookiesها و ورودی های فرم هم در این پایگاه داده ذخیره می شوند . برای دسترسی به پایگاه داده فایر فاکس می توانید از SQLite Manager استفاده کنید .

به کمک این افزونه شما می توانید همه فایل های SQLite را مشاهده کنید یا فایل جدیدی ایجاد کنید و یا دستورات SQL را در آن اجرا کنید .

دانلود SQLite Manager



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

در اکثر برنامه های کامپیوتری نیاز به ذخیره و بازیابی داده ها وجود دارد. داده هایی که بدون آن ها سیستم نرم افزاری ما معنایی ندارد. برنامه نویسان معمولاً راه های مختلفی برای این کار سراغ دارند. کسانی که با دات نت فریم ورک برنامه نویسی می کنند راه های مختلفی برای دسترسی به داده ها دارند. در این مطلب با تکنولوژی های مایکروسافت برای این کار آشنا خواهیم شد و سه 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

طراحی پایگاه داده های سیستم های بانکی و مالی  ERP

ERP چیست؟

طراحی (ERP (Enterprise resource planning در دهه 80 متولد شد. رشد روزافزون و بی حد تکنولوژی اطلاعات برپایه سخت افزارها و نرم افزارها و همچنین نقش هرچه پررنگتر اطلاعات در زندگی امروزه، نیاز به نوآوری و تغییرات در طراحی و تفکر سیستمی ابزارهای نرم افزاری داشت تا بتواند پاسخگوی این رشد باشد. به همین منظور ERP پا به عرصه وجود گذاشت. هدف های اصلی ERP خلاصه می شد به:
- ایجاد جریان اطلاعات به هدف تصمیم گیری مدیران در سطوح مختلف
- استفاده کارآمد از قسمت های نرم افزار
- کنترل اطلاعاتی+ انبارداری + حسابداری + نیروی انسانی + توزیع + ...
- کمک به تحقق برنامه ها در زمانبندی پیش بینی شده
- قابلیت شکل پذیری (
customization)  به حد اعلاء
- متشکل بودن از بخش های یکپارچه (
modules)

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


ادامه نوشته

دیتا سنتر ملی سهم زعیم- ایزایران شد

شرکت ارتباطات زیرساخت وعده بهره‌برداری از مرکز داده ملی در سال آینده را داد

دیتا سنتر ملی سهم زعیم- ایزایران شد

سرویس زیرساخت- دو شرکت زعیم- ایزایران به صورت مشارکتی عهده‌دار راه‌اندازی مرکز داده (IDC) ملی شدند.

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


گرچه شرکت ارتباطات زیرساخت پیش از این فراخوانی برای شناسایی شرکت‌های توانمند برای راه‌اندازی این مرکز منتشر کرده و در نهایت سه گروه متشکل از تکفام، دو شرکت زعیم- ایزایران و کنسرسیومی دیگر متشکل از 17 شرکت فعال در این حوزه برای راه‌اندازی آن اعلام آمادگی کرده بودند اما سرانجام با تصمیم نهادهای تصمیم‌گیر و مصوبه دولت اجرای این پروژه به زعیم- ایزایران واگذار شد.


شرکت ارتباطات زیرساخت ابتدا برای اجرای این پروژه مناقصه برگزار کرده و سه شرکت نیز برای حضور در آن اسناد مناقصه را خریداری کرده بودند اما در میانه راه مصوبه هیئت دولت را دریافت کرد که منجر شد تا پاکات مناقصه و پیشنهادات شرکت‌ها دریافت نشود.


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


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

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

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

موضوع راه‌اندازی دیتاسنتر ملی به سال 83 و با نام شارع2 باز می‌گردد که از سوی شرکت فناوری اطلاعات مطرح شده و قرار بود تا دی ماه همان سال راه‌اندازی شده و به بهره‌برداری برسد که سرانجام در اسفند ماه سال 84 اعلام شد شارع 2 به دلیل ظرفیت پائین در عمل می‌تواند تنها به تعداد معدودی از سایت‌های دولتی خدمات ارائه کند و پس از آن به دلیل محرمانه بودن اطلاعات این دیتاسنتر خبری از آن منتشر نشد و ادامه توسعه آن منتفی شد.

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

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

اگرچه تاکنون چندین بار مصوبه‌ای مبنی بر استفاده از میزبانی ایرانی برای دستگاه‌های دولتی صادر شده است اما در حال حاضر میزبانی اکثر سایت‌های ایرانی در خارج از کشور صورت می‌گیرد که در صورت بهره‌برداری از مرکز داده ملی (IDC) و انتقال میزبانی سایت‌های ایرانی به داخل کشور، از ترانزیت اطلاعات به خارج از کشور جلوگیری به عمل می‌آید که جنبه‌ امنیتی این مسئله از اهمیت ویژه‌ای برخوردار است.

محمدباقر ظهوری فر – مدیرعامل شرکت ارتباطات زیرساخت- پیش از این گفته بود: مرکز ملی داده به منظور نگهداری اطلاعات حساس ارگان‌های دولتی در یک مرکز داخلی در شرکت ارتباطات زیرساخت راه‌اندازی می‌شود و با اجرای آن، امکان انتقال میزبانی سایت‌های سازمان‌های مختلف دولتی از دیگر کشورها به داخل کشور فراهم خواهد شد و با اجرای فاز نخست این طرح، شمار زیادی از میزبانی این سایت‌ها به داخل کشور منتقل خواهد شد که این موضوع از لحاظ امنیتی قابل اهمیت است.

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

IDC ملی با هدف ذخیره‌سازی اطلاعات حساس سازمان‌های دولتی و همچنین میزبانی خدمات دولت الکترونیکي در داخل کشور راه‌اندازی خواهد شد.

وظیفه این مرکز داده، متمرکز کردن داده‌ها و هدایت و مدیریت آنها در داخل کشور و کاهش ترانزیت ترافیک بین‌المللی و دسترسی‌پذیری بالا، قابلیت اطمینان و سطح امنیت قابل قبول از ویژگی‌های این مرکز است.

پایگاه داده در asp.net

آموزش استفاده از پایگاه داده در asp.net  برای مبتدیان :

لینک دانلود : ِDataAccess.pdf