آموزش MVC - قسمت نهم - WebGrid در 3 MVC
  در این مقاله شما با ابزار webGrid که در MVC نگارش 3 وجود دارد آشنا می شوید و خصوصیاتی چون مرتب سازی، صفحه بندی، انتخاب و سفارشی سازی سطرها با استفاده از webGrid را فراخواهید گرفت.
   ASP.NET MVC
   ۲۸۶۸۲
   این مقاله حاوی فایل ضمیمه نمی باشد
   امیر مددی
   ۱۳۹۰/۹/۱۷
ارسال لینک صفحه برای دوستان ارسال لینک صفحه برای دوستان  اضافه کردن به علاقه مندیها اضافه کردن به علاقه مندیها   نسخه قابل چاپ نسخه قابل چاپ

 

WebGrid ابزار جدید و ساده ای است در MVC 3 که برای نمایش داده ها در View  بکار می رود و امکاناتی چون صفحه بندی، مرتب سازی ، متمایز سازی سطرها و ... را داراست. در این جلسه با این ابزار و مزایای آن آشنا خواهیم شد.یکی از مزایای استفاده از WebGrid  این است که نیاز به اضافه کردن هیچ چیزی به صفحه (مثل رفرنس JQuery یا غیره ) نیست. WebGrid در فضای نام  System.Web.Helpers قرار دارد که با ایجاد یک پروژه ازنوع MVC  بصورت اتوماتیک در پروژه شما وجود دارد.

در ساده ترین حالت ، شما می توانید در کنترلر خود، با هر کوئری دلخواهی داده ها را از بانک اطلاعاتی بخوانید، مثل این مثال:

 Database1Entities db = new Database1Entities();
 public ActionResult Index()
        {
            var list = (from n in db.Students select n);
          return View(list);       }

 

(توضیح اینکه برای ارتباط با بانک اطلاعاتی در این مثال از Entityfarmework  و LinqToSql استفاده شده است.)

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

@{
    var grid = new WebGrid(Model);
}
<div>
    @grid.GetHtml(columns:
                        grid.Columns(
                                        grid.Column("Name""Student Name"),
                                        grid.Column("Family""Student Family"),
                                        grid.Column("Age""AGE")
                                     )
                  )
</div>
در کد فوق ابتدا یک نمونه از WebGrid  ایجاد شده است و سپس ستونهای آن مشخص شده اند. grid.GetHtml مشخص کننده مشخصات گرید است مثل ستونها ، خصوصیتها و استایلها. ستونها با grid.Column مشخص 
می شوند . پارامتر اول در grid.Column نام فیلد بانک اطلاعاتی است و پارامتر دوم نام سرستون آن موقع نمایش می باشد. 

نتیجه بصورت زیر خواهد بود:

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

 grid.Column(format: item => item.Name + " - " + item.Family , header: "Name" )
در کد فوق از نحوه نگارش لامبدا استفاده شده است که شما متغیر دلخواهی را در نظر می گیرید و با علامت  => و تکرار آن متغیر ، به فیلدهای بانک اطلاعاتی دستیابی پیدا می کنید. مثل x => x.Name
زمان ایجاد نمونه از روی WebGrid نیز می توانید از سایر پارامترهای مفید آن استفاده کنید. پارامتر اول که همان Model  است و داده های شما را در بر دارد ولی پارامترهای دیگری نیز دارد که ساده ترین آنها عبارتند از : 
 var grid = new WebGrid(source: Model , rowsPerPage: 10, defaultSort: "NAME" , canPage: true, canSort: true); 
پارامترها به ترتیب 1- source نگه دارنده داده ها، 2- rowsPerPage تعداد سطر جدول در هر صفحه، 3- defaultSort نام فیلدی که مرتب سازی بر اساس آن انجام می شود  4- CanPage صفحه بندی شود یا نه 5- canSort 
مرتب شود یا نه پارامترهای تقریبا مشابهی را نیز می توانید بعد از grid.GetHtml بیاورید مثل  :
 1: gridItens.GetHtml(
   2:      tableStyle: "webgrid",
   3:      headerStyle: "webgrid-header",
   4:      footerStyle: "webgrid-footer",
   5:      alternatingRowStyle: "webgrid-alternating-row",
   6:      selectedRowStyle: "webgrid-selected-row",
   7:      rowStyle: "webgrid-row-style")
 
 

همانطور که از نام پارامترها مشخص است ، tableStyle  نام کلاس CSS مربوط به خود جدول است. ، headerStyle کلاس قسمت هدر جدول ، footerStyle نام کلاس مربوط به فوتر جدول و alternatingRowStyle مربوط به استایل سطرها بصورت یک در میان است تا از یکدیگر تشخیص داده شوند. selectedRowStyle نام کلاس سطر انتخاب شده است و rowStyle نام کلاس همه سطرها می باشد. شما می توانید همه این کلاسها را در فایل View (و یا یک فایل css جداگانه ) خود یکجا بیاورید، مثل :

  1: .webgrid
   2: {
   3:     width: 50%;
   4:     border: 0px;
   5:     border-collapse: collapse;
   6: }
   7:  
   8: .webgrid a
   9: {
  10:     color: #000;
  11: }
  12:  
  13: .webgrid-header
  14: {
  15:     padding: 6px 5px;
  16:     text-align: center;
  17:     background-color: #e8eef4;
  18:     border-bottom: 2px solid #3966A2;
  19:     height: 40px;
  20:  
  21:     border-top: 2px solid #D6E8FF;
  22:     border-left: 2px solid #D6E8FF;
  23:     border-right: 2px solid #D6E8FF;
  24: }
  25:  
  26: .webgrid-footer
  27: {
  28:     padding: 6px 5px;
  29:     text-align: center;
  30:     background-color: #e8eef4;
  31:     border-top: 2px solid #3966A2;
  32:     height: 30px;
  33:  
  34:     border-bottom: 2px solid #D6E8FF;
  35:     border-left: 2px solid #D6E8FF;
  36:     border-right: 2px solid #D6E8FF;
  37: }
  38:  
  39: .webgrid-alternating-row
  40: {
  41:     height: 30px;
  42:     background-color: #f2f2f2;
  43:     border-bottom: 1px solid #d2d2d2;
  44:  
  45:     border-left: 2px solid #D6E8FF;
  46:     border-right: 2px solid #D6E8FF;
  47: }
  48:  
  49: .webgrid-row-style
  50: {
  51:     height: 30px;
  52:     border-bottom: 1px solid #d2d2d2;
  53:  
  54:     border-left: 2px solid #D6E8FF;
  55:     border-right: 2px solid #D6E8FF;
  56: }
  57:  
  58: .webgrid-selected-row
  59: {
  60:     font-weight: bold;
  61: }
 

اگر در یک View بخواهید بیش از یک WebGrid داشته باشید، آنگاه باید هنگام ایجاد نمونه WebGrid خصوصیت  feildNamePerfix را نیز ذکر کنید تا در هنگام ارجاع درخواستها ، نام آن را با این پیشوند از نام بقیه WebGrid ها متمایز کند:

   1: var gridItens = new WebGrid(source: Model,
   2:      defaultSort: "Title",
   3:      rowsPerPage: 5,
   4:      canPage: true,
   5:      canSort: true,
   6:      fieldNamePrefix: "gridItens_",
   7:      pageFieldName: "inside",
   8:      selectionFieldName: "selectedRow");
 

همانطور که می بینید در خط 6 پیشوندی به نام _gridItens مشخص شده که باعث می شود هنگام ارسال یک درخواست  نام این WebGrid با نامی که ما مشخص کرده ایم جایگزین شود و  URL صفحه  به چیزی شبیه شکل زیر تبدیل شود:

اما خطوط 7 و 8 چه چیزهایی را تعریف می کنند؟ به نظر می رسد که آنها هم دارند اسم پارامترهایی را جایگزین می کنند؟!

بله ، از آنجایی که برای همه WebGrid ها دو پارامتر مشترک به نامهای page  و row در هنگام تشکیل query string (پارامترهای موجود در URL ) وجود دارد، باید نام این دو پارامتر را به هنگام ساخت نمونه جدید تغییر داد تا هر WebGrid بتواند پارامتر page  و row  مختص خود را پیدا کند، بنابراین پارامتر pageFieldName برای جایگزین کردن page  با یک عبارت دیگر در این WegGrid و عبارت selectionFieldName برای جایگزینی row استفاده شده است.

بهینه سازی ستونها :

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

  1: columns: gridItens.Columns(
   2:  
   3:      gridItens.Column(
   4:          columnName: "Title",
   5:          header: "Título",
   6:          style: "text-align-left"),
   7:  
   8:      gridItens.Column(
   9:          columnName: "Price",
  10:          header: "Preço",
  11:          style: "text-align-center",
  12:          format: (item) => string.Format("{0:C}", item.Price)),
  13:  
  14:     gridItens.Column(
  15:          columnName: "Quantity",
  16:          header: "Qtd em Estoque",
  17:          style: "text-align-center")
  18:  )

در خط 11 فیلد Price به واحد پولی تبدیل شده ، بنابراین موقع چاپ علامت واحد پولی ( $ ) کنار آن قرار می گیرد.

انتخاب یک سطر:

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

@grid.GetHtml(columns:
                        grid.Columns(
              			grid.Column(format: item => item.Name + " - " + item.Family , header: "Name" ),
                                     grid.Column("", format: (item) => item.GetSelectLink("select row")),
                                     grid.Column("Age""AGE")
                                     )
                  )

با کلیک روی عبارت Select row شماره سطری که روی آن کلیک شده برگردانده می شود.

توجه داشته باشید که عددی که در متغیر row قرارمی گیرد شماره سطر است نه ID .

          * : این مقاله گزیده ای بود از مجموعه مقالات زیر: 

http://weblogs.asp.net/andrebaltieri/archive/2010/11/01/asp-net-mvc-3-working-with-webgrid.aspx

http://weblogs.asp.net/andrebaltieri/archive/2010/11/02/asp-net-mvc-3-working-with-webgrid-part-2.aspx

http://weblogs.asp.net/shijuvarghese/archive/2010/10/08/using-the-webgrid-helper-in-asp-net-mvc-3-beta.aspx

       ** همچنین لینک مربوط به WebGrid در MSDN : 

http://msdn.microsoft.com/en-us/library/system.web.helpers.webgrid(v=vs.99).aspx