کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش نحوه استفاده از جدول های jQuery با ASP.NET CORE MVC

نحوه استفاده از جدول های jQuery با ASP.NET CORE MVC

در این مقاله، ما قصد داریم نحوه استفاده از Client Side Grid (DataTables Grid) را با ASP.NET Core MVC گام به گام یاد بگیریم. اکثر برنامه نویس ها از "DataTables Grid" استفاده می کنند و اگر دلیل استفاده شان را بپرسید ، می گویند: "چون استفاده از آن آسان و open source است".

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

همانطور که می دانید، Grids های داخلی در ASP.NET Core وجود ندارد.یا باید خودتان ایجاد کنید و یا از Grids هایی که در NuGet package موجود است استفاده کنید. بهترین گزینه این است که از Grid سمت client استفاده کنید. من میخواهم از DataTables Grid جی کوئری استفاده کنم.

آموزش Asp.net MVC Core

ابتدا با بخش پایگاه داده شروع کنید.

بخش پایگاه داده

من یک پایگاه داده با نام "CustomerDB" و در آن، جدول "CustomerTB" ایجاد کرده ام.

آموزش Asp.net MVC Core

بعد، ما می خواهیم یک ASP.NET Core MVC Web application ایجاد کنیم.

ایجاد ASP.NET Core MVC Web Application

برنامه Visual Studio 2017 باز کنید:

آموزش Asp.net MVC Core

پس از باز کردن IDE، ما می خواهیم پروژه ASP.NET Core MVC ایجاد کنیم. برای انجام این کار، فقط روی File >> New >> Project کلیک کنید.

آموزش Asp.net MVC Core

پس از انتخاب project ، یک پنجره جدید با نام « New Project » ظاهر خواهد شد. در آن، ما میخواهیم Visual C # Project Templates >> Web >> ASP.NET Core Web Application را انتخاب کنیم. سپس، نام پروژه را ExampleGrid خواهیم گذاشت.

آموزش Asp.net MVC Core

پس از نامگذاری پروژه، ما می خواهیم روی دکمه OK برای ایجاد یک پروژه کلیک کنیم.یک پنجره برای انتخاب قالب برای ایجاد ASP.NET Core Web Application باز می شود در اینجا ما میخواهیم برنامه MVC ایجاد کنیم.به همین دلیل ما Web Application (Model View Controller) انتخاب می کنیم و سپس برای انتخاب (.Net core) و (.Net Framework) اقدام می کنیم.برای این پروژه از .Net Framework و ASP.NET Core 1.1 استفاده می کنیم و بعد از آن برای ایجاد پروژه روی دکمه OK کلیک می کنیم.

آموزش Asp.net MVC Core

پس از کلیک روی OK، شروع به ایجاد یک پروژه خواهید کرد.

ساختار پروژه

آموزش Asp.net MVC Core

پس از ایجاد برنامه، ما باید منابع مورد نیاز برای Entity Framework Core را اضافه کنیم.

نصب بسته برای Entity framework core از NuGet

برای نصب بسته، فقط روی پروژه کلیک راست کنید (ExampleGrid) و سپس Manage NuGet package را انتخاب کنید. تصویر زیر پنجره NuGet Package Manager نشان میدهد.

در قسمت مرورگر، "Microsoft.EntityFrameworkCore.SqlServer" را در کادر جستجو تایپ کنید و فقط روی دکمه Install کلیک کنید.  

Microsoft.EntityFrameworkCore.SqlServer

آموزش Asp.net MVC Core

اضافه کردن Connection string و تنظیم DbContext

پس از اضافه کردن reference ، حال یک connection string در فایل appsetting.json اضافه کنید.

آموزش Asp.net MVC Core

پس از اضافه کردن یک connection string ، مرحله بعدی اضافه کردن یک کلاس است که کلاس DbContext را به ارث برده باشد. قبل از انجام این کار، ابتدا یک پوشه به نام models ایجاد می کنیم و درون آن، ما قصد داریم این کلاس را اضافه کنیم.

برای اضافه کردن یک پوشه، فقط روی پروژه کلیک راست کنید (ExampleGrid)، سپس از منویی که ظاهر می شود، Add را اضافه کنید و New Folder را انتخاب کنید.

Add - New Folder.

آموزش Asp.net MVC Core

حالا، اجازه دهید یک کلاس با نام DatabaseContext در پوشه Models بگذاریم.

برای اضافه کردن یک مدل، فقط کافیست بر روی پوشه Models راست کلیک کنید. سپس، Add >> Class را انتخاب کنید. یک پنجره " Add New Item " باز می شود که در آن کلاس پیش فرض انتخاب شده است. کلاس را به نام DatabaseContext نامگذاری کنید و روی دکمه Add کلیک کنید.

آموزش Asp.net MVC Core

بعد از اضافه کردن یک کلاس DatabaseContext، می خواهیم از کلاس DbContext ارث ببریم.

پس از ارث بردن از DbContext، یک constructor ایجاد می کنیم که DbContextOptions را به عنوان پارامتر ورودی می گیرد و همچنین constructor کلاس پایه (: base (options)) [DbContext] را به ارث می برد.

آموزش Asp.net MVC Core

بعد، ما می خواهیم یک Service جدید در کلاس Startup.cs برای تزریق وابستگی(injecting dependency) اضافه کنیم.

حالا، هر زمان که از کلاس DatabaseContext استفاده می کنید، نمونه DbContext در آنجا تزریق می شود.

آموزش Asp.net MVC Core

افزودن مدل CustomerTB

آموزش Asp.net MVC Core

پس از افزودن Model CustomerTB، در مرحله بعدی ما قصد داریم DbSet تمام مدل ها را در کلاس DatabaseContext اضافه کنیم.

اضافه کردن DbSet برای Model CustomerTB در کلاس DatabaseContext

حالا، اجازه دهید DbSet را برای Model CustomerTB در کلاس DatabaseContext اضافه کنیم، همانطور که در زیر نشان داده شده است.

آموزش Asp.net MVC Core

پس از اضافه کردن Model CustomerTB در کلاس DatabaseContext، در قدم بعدی ما قصد داریم یک کنترلر ایجاد کنیم.

آموزش Asp.net MVC Core

پس از کلیک کردن بر روی دکمه Add ، DemoGridController را در پوشه Controller ایجاد کرده همانطور که تصویر زیر نشان می دهد:

آموزش Asp.net MVC Core

پس از اضافه کردن DemoGridController ما قصد داریم DataTables Scripts را دانلود کنیم و آن را به پروژه اضافه کنیم.

گرفتن DataTables Scripts

در این مثال، فایل های Javascript library زیر استفاده می شود.

  • http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js
  • https://cdn.datatables.net/1.10.15/js/jquery.dataTables.min.js
  • https://cdn.datatables.net/1.10.15/js/dataTables.bootstrap4.min.js

فایل های CSS زیر در این مثال استفاده می شود:

Bootstrap v3.3.7

https://getbootstrap.com/docs/3.3/getting-started/

DataTables CSS files

  • https://cdn.datatables.net/1.10.15/css/dataTables.bootstrap.min.css
  • https://cdn.datatables.net/responsive/2.1.1/css/responsive.bootstrap.min.css

افزودن متد ShowGrid در کنترلر DemoGrid

آموزش Asp.net MVC Core

پس از اضافه کردن اکشن حال میخواهیم یک View با نام ShowGrid اضافه کنیم:

اضافه کردن ShowGrid View در پوشه DemoGrid

آموزش Asp.net MVC Core

اضافه کردن Grid DataTables به ShowGrid View

در ابتدا قصد داریم مرجع اسکریپت و سی اس اس را اضافه کنیم.

< script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" >< /script >  
< link href="~/lib/bootstrap/dist/css/bootstrap.css" rel="stylesheet" / >
< link href="https://cdn.datatables.net/1.10.15/css/dataTables.bootstrap.min.css" rel="stylesheet" / >
< link href="https://cdn.datatables.net/responsive/2.1.1/css/responsive.bootstrap.min.css" rel="stylesheet" / >  
< script src="https://cdn.datatables.net/1.10.15/js/jquery.dataTables.min.js" >< /script >  
< script src="https://cdn.datatables.net/1.10.15/js/dataTables.bootstrap4.min.js " >< /script > 

بعد از اضافه کردن مرجع اسکریپت و CSS، ما می خواهیم افزونه DataTables Markup اضافه کنیم.

اضافه کردن افزومه DataTables

Html Table ساده ای است که در آن می خواهیم هدرهای ستون اضافه کنیم ("< th >") تمام ستون هایی که می خواهیم نمایش داده شود.

آموزش Asp.net MVC Core
  < div class="container" >  
    < br / >
    < div style="width:90%; margin:0 auto;" >  
        < table id="example" class="table table-striped table-bordered dt-responsive nowrap" width="100%" cellspacing="0" >  
            < thead >  
                < tr >  
                    < th >CustomerID< /th >  
                    < th >Name< /th >  
                    < th >Address< /th >  
                    < th >Country< /th >  
                    < th >City< /th >  
                    < th >Phoneno< /th >  
                    < th >Edit< /th >  
                    < th >Delete< /th >  
                < /tr >  
            < /thead >  
        < /table >  
    < /div >  
< /div >  

بعد از اضافه کردن Markup بعد ما قصد داریم تابع(function) datatables را برای ایجاد datatables اضافه کنیم.

اضافه کردن تابع DataTables برای ایجاد DataTables

Basic syntax

$('#example').dataTable( {  
} );  

گزینه های DataTables

تمام تعاریف از وب سایت https://datatables.net گرفته شده است.

  • Processing : Enable یا disable نمایش processing هنگام پردازش جدول (به عنوان مثال مرتب سازی)
  • serverSide : پردازش سمت سرور - جایی که filtering ، paging و sorting محاسبات توسط سرور انجام می شود.
  • Filter : این گزینه برای فعال و غیرفعال کردن search box استفاده می شود.
  • orderMulti : هنگامی که (ordering) فعال می شود، به طور پیش فرض DataTables به کاربران امکان می دهد ستون های چندگانه را با تغییر دکمه روی سلول هدر برای هر ستون مرتب کنند. اگرچه این می تواند برای کاربران بسیار مفید باشد، همچنین می تواند پیچیدگی سفارش را افزایش دهد،و همچنین افزایش ظرفیت پردازش داده ها را افزایش می دهد. بنابراین، این option برای اجازه دادن به این قابلیت shift-click چند ستون ارائه شده است.
  • Ajax : Ajax request برای گرفتن اطلاعات به DataTables ساخته شده است.
  • columnDefs : خواص(properties) اولیه برای تعریف ستون را تنظیم کنید.
  • Columns : خواص(properties) اولیه اولیه ستون را تنظیم کنید.

پس از اتمام درک options ها یا properties ها ما قصد داریم آن را تنظیم کنیم.

ما قصد داریم گزینه " processing " را برای نمایش نوار processing درست کنیم ، پس از آن ما قصد داریم گزینه "serverSide" را به درستی تنظیم کنیم، زیرا ما می خواهیم paging و فیلتر کردن در serverSide انجام دهیم.

بعد از گزینه "serverSide" گزینه " filter " است. ما قصد داریم از جعبه جستجو استفاده کنیم. به همین دلیل ما این property را به true تنظیم کردیم ، "orderMulti" نیز false تنظیم شده است زیرا ما نمی خواهیم ستون های چندگانه را یک بار مرتب کنیم.

DataTables Options snapshot

آموزش Asp.net MVC Core

Ajax Option

و گزینه اصلی Ajax است که ما برای فراخوانی یک Action Method برای گرفتن داده ها برای اتصال به DataTables Grid استفاده می کنیم که داده ها در فرمت Json هستند.برای اینکه ما میخواهیم URL: -"/DemoGrid/LoadData” منتقل کنیم ، این درخواست Post request است و نوع داده ای که قرار است تنظیم شود Json است.

ما می خواهیم اکشن متد LoadData که در کنترلر DemoGrid است را فراخوانی کنیم که در مراحل بعدی توضیح خواهیم داد.

به عنوان مثال:

آموزش Asp.net MVC Core

columnDefs Option

پس از تنظیم Ajax ما یک گزینه columnDefs می خواهیم که برای پنهان کردن کلید اولیه(Primary key) جدول (CustomerID) استفاده کنیم و همچنین قابل جستجو نباشد.

به عنوان مثال:

آموزش Asp.net MVC Core

columns Option

در نهایت، آخرین option دوم، ستون هایی است که برای راه اندازی DataTables grid استفاده می شوند.اضافه کردن property برای render کردن grid که که باید در این گزینه option تعریف شده است.

به عنوان مثال:

آموزش Asp.net MVC Core

کلید Render در Columns ها

در نهایت، ما باید یک دکمه در grid برای edit کردن داده ها و حذف داده ها داشته باشیم.

آموزش Asp.net MVC Core

درنهایت با کلیک کردن بر روی دکمه delete ما می تونیم یک function سفارشی شده را برای حذف داده ها فراخوانی کنیم

قطعه کد کامل ShowGrid View

@{  
    Layout = null;  
}  
  
< script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" >< /script >  
< link href="~/lib/bootstrap/dist/css/bootstrap.css" rel="stylesheet" / >
< link href="https://cdn.datatables.net/1.10.15/css/dataTables.bootstrap.min.css" rel="stylesheet" / >
< link href="https://cdn.datatables.net/responsive/2.1.1/css/responsive.bootstrap.min.css" rel="stylesheet" / >  
< script src="https://cdn.datatables.net/1.10.15/js/jquery.dataTables.min.js" >< /script >  
< script src="https://cdn.datatables.net/1.10.15/js/dataTables.bootstrap4.min.js " >< /script >    
< div class="container" >  
< br / >
    < div style="width:90%; margin:0 auto;" >  
        < table id="example" class="table table-striped table-bordered dt-responsive nowrap" width="100%" cellspacing="0" >  
            < thead >  
                < tr >  
                    < th >CustomerID< /th >  
                    < th >Name< /th >  
                    < th >Address< /th >  
                    < th >Country< /th >  
                    < th >City< /th >  
                    < th >Phoneno< /th >  
                    < th >Edit< /th >  
                    < th >Delete< /th >  
                < /tr >  
            < /thead >  
        < /table >  
    < /div >  
< /div >  
  
< script >


        $(document).ready(function ()
        {
            $("#example").DataTable({
                "processing": true, // for show progress bar
                "serverSide": true, // for process server side
                "filter": true, // this is for disable filter (search box)
                "orderMulti": false, // for disable multiple column at once
                "ajax": {
                    "url": "/DemoGrid/LoadData",
                    "type": "POST",
                    "datatype": "json"
                },
                "columnDefs":
                [{
                    "targets": [0],
                    "visible": false,
                    "searchable": false
                }],
                "columns": [
                    { "data": "CustomerID", "name": "CustomerID", "autoWidth": true },
                    { "data": "Name", "name": "Name", "autoWidth": true },
                    { "data": "Address", "name": "Address", "autoWidth": true },
                    { "data": "Country", "name": "Country", "autoWidth": true },
                    { "data": "City", "name": "City", "autoWidth": true },
                    { "data": "Phoneno", "name": "Phoneno", "autoWidth": true },
                    {
                        "render": function (data, type, full, meta)
                        { return '< a class="btn btn-info" href="/DemoGrid/Edit/' + full.CustomerID + '" >Edit< /a >'; }
                    },
                    {
                        data: null, render: function (data, type, row)
                        {
                            return "< a href='#' class='btn btn-danger' onclick=DeleteData('" + row.CustomerID + "');  >Delete< /a >";
                        }
                    },
                ]

            });
        });


    function DeleteData(CustomerID)
        {
            if (confirm("Are you sure you want to delete ...?"))
            {
                Delete(CustomerID);
            }
            else
            {
                return false;
            }
        }


        function Delete(CustomerID)
    {
        var url = '@Url.Content("~/")' + "DemoGrid/Delete";

            $.post(url, { ID: CustomerID }, function (data)
                {
                    if (data)
                    {
                        oTable = $('#example').DataTable();
                        oTable.draw();
                    }
                    else
                    {
                        alert("Something Went Wrong!");
                    }
                });
    }

< /script > 

با مقدار دهی اولیه DataTables grid، ما قصد داریم متد LoadData Action را ایجاد کنیم.

افزودن متد LoadData به کنترلر DemoGrid

در اینجا ما قصد داریم متد Action با نام LoadData را اضافه کنیم. در این متد همه پرونده های مشتری را از پایگاه داده برای نمایش و بر اساس پارامتری که ما می خواهیم مرتب سازی می کنیم ، و عملیات paging را انجام می دهیم.

ما paging و filtering داده ها را در سمت سرور انجام می دهیم؛ به همین دلیل از IQueryable استفاده می کنیم که queries ها را با filters ها در سمت سرور اجرا کنیم.

آموزش Asp.net MVC Core

برای استفاده از OrderBy در query ما باید بسته System.Linq.Dynamic را از NuGet packages نصب کنیم.

آموزش Asp.net MVC Core

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

قطعه کد کامل اکشن LoadData

همه فرآیندهای این مقاله گام به گام هستند؛ بنابراین آسان است که موضوغات را درک کنید.

تمام پارامترهای Request.Form وقتی که AJAX post method بر روی load خوانده می شود، جمع می شود.

public IActionResult LoadData()  
       {  
           try  
           {  
               var draw = HttpContext.Request.Form["draw"].FirstOrDefault();  
               // Skip number of Rows count  
               var start = Request.Form["start"].FirstOrDefault();  
               // Paging Length 10,20  
               var length = Request.Form["length"].FirstOrDefault();  
               // Sort Column Name  
               var sortColumn = Request.Form["columns[" + Request.Form["order[0][column]"].FirstOrDefault() + "][name]"].FirstOrDefault();  
               // Sort Column Direction (asc, desc)  
               var sortColumnDirection = Request.Form["order[0][dir]"].FirstOrDefault();  
               // Search Value from (Search box)  
               var searchValue = Request.Form["search[value]"].FirstOrDefault();  
               //Paging Size (10, 20, 50,100)  
               int pageSize = length != null ? Convert.ToInt32(length) : 0;  
               int skip = start != null ? Convert.ToInt32(start) : 0;  
               int recordsTotal = 0;  
               // getting all Customer data  
               var customerData = (from tempcustomer in _context.CustomerTB  
                                   select tempcustomer);  
               //Sorting  
               if (!(string.IsNullOrEmpty(sortColumn) && string.IsNullOrEmpty(sortColumnDirection)))  
               {  
                   customerData = customerData.OrderBy(sortColumn + " " + sortColumnDirection);  
               }  
               //Search  
               if (!string.IsNullOrEmpty(searchValue))  
               {  
                   customerData = customerData.Where(m => m.Name == searchValue);  
               }  
               //total number of rows counts   
               recordsTotal = customerData.Count();  
               //Paging   
               var data = customerData.Skip(skip).Take(pageSize).ToList();  
               //Returning Json Data  
               return Json(new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = data });  
           }  
           catch (Exception)  
           {  
               throw;  
           }  
       }   

قطعه کد کامل DemoGridController

در این بخش، ما از تزریق constructor برای تزریق وابستگی های DBContext استفاده می کنیم. و با استفاده از DBContext، ما تمام داده های مشتری را از پایگاه داده می گیریم.

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Threading.Tasks;  
using Microsoft.AspNetCore.Mvc;  
using ExampleGrid.Models;  
using System.Linq.Dynamic;  
// For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860  
  
namespace ExampleGrid.Controllers  
{  
    public class DemoGridController : Controller  
    {  
        private DatabaseContext _context;  
  
        public DemoGridController(DatabaseContext context)  
        {  
            _context = context;  
        }  
        // GET: /< controller >/  
        public IActionResult ShowGrid()  
        {  
            return View();  
        }  
  
        public IActionResult LoadData()  
        {  
            try  
            {  
                var draw = HttpContext.Request.Form["draw"].FirstOrDefault();  
                // Skiping number of Rows count  
                var start = Request.Form["start"].FirstOrDefault();  
                // Paging Length 10,20  
                var length = Request.Form["length"].FirstOrDefault();  
                // Sort Column Name  
                var sortColumn = Request.Form["columns[" + Request.Form["order[0][column]"].FirstOrDefault() + "][name]"].FirstOrDefault();  
                // Sort Column Direction ( asc ,desc)  
                var sortColumnDirection = Request.Form["order[0][dir]"].FirstOrDefault();  
                // Search Value from (Search box)  
                var searchValue = Request.Form["search[value]"].FirstOrDefault();  
  
                //Paging Size (10,20,50,100)  
                int pageSize = length != null ? Convert.ToInt32(length) : 0;  
                int skip = start != null ? Convert.ToInt32(start) : 0;  
                int recordsTotal = 0;  
  
                // Getting all Customer data  
                var customerData = (from tempcustomer in _context.CustomerTB  
                                    select tempcustomer);  
  
                //Sorting  
                if (!(string.IsNullOrEmpty(sortColumn) && string.IsNullOrEmpty(sortColumnDirection)))  
                {  
                    customerData = customerData.OrderBy(sortColumn + " " + sortColumnDirection);  
                }  
                //Search  
                if (!string.IsNullOrEmpty(searchValue))  
                {  
                    customerData = customerData.Where(m => m.Name == searchValue);  
                }  
  
                //total number of rows count   
                recordsTotal = customerData.Count();  
                //Paging   
                var data = customerData.Skip(skip).Take(pageSize).ToList();  
                //Returning Json Data  
                return Json(new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = data });  
  
            }  
            catch (Exception)  
            {  
                throw;  
            }  
  
        }  
    }  
}  

تمام کد ها را ذخیره کنید و برنامه را اجرا کنید.

اجرای برنامه

برای دسترسی به برنامه URL زیر را وارد کنید:

http://localhost:#####/demogrid/showgrid

"#####" شماره پورت localhost است.

آموزش Asp.net MVC Core

Real time Debugging Snapshot

در این بخش می توانید ببینید که مقادیر به چه صورت نوشته شده است.

آموزش Asp.net MVC Core

جستجو با DataTables grid

در این بخش ما فقط جستجوی ستون نام را انجام می دهیم.اگر میخواهید ستون دیگری اضافه کنید می توانید به شرط (“||”) اضافه کنید.

آموزش Asp.net MVC Core

اضافه کردن ستون های بیشتری برای جستجو

آموزش Asp.net MVC Core

نسخه ی نمایشی جستجو

آموزش Asp.net MVC Core

ویرایش و حذف با تأییده(Confirmation) در DataTables grid

در این بخش ما بر روی دکمه 2 ویرایش و حذف تمرکز می کنیم. edit برای ویرایش سوابق استفاده می شود. در این قسمت شما فقط باید آدرس URL ویرایش را با پارامتر آن ارائه دهید.

در زیر syntax برای رندر کردن دکمه ویرایش است

آموزش Asp.net MVC Core

برای دکمه حذف ، ما فقط می توانیم همان کاری که با Edit انجام دادیم انجام دهیم اما برای انجام این کار نیاز به یک صفحه دیگر داریم اما اگر ما می خواهیم line را حذف کنیم، باید از دستور زیر برای رندر کردن استفاده کنیم.

در زیر syntax برای رندر کردن دکمه حذف است

آموزش Asp.net MVC Core
< script >

   function DeleteData(CustomerID)
        {
            if (confirm("Are you sure you want to delete ...?"))
            {
                Delete(CustomerID);
            }
            else
            {
                return false;
            }
        }


    function Delete(CustomerID)
    {
      var url = '@Url.Content("~/")' + "DemoGrid/Delete";
      $.post(url, { ID: CustomerID }, function (data)
      {
          if (data)
          {
              oTable = $('#example').DataTable();
              oTable.draw();
          }
          else
          {
              alert("Something Went Wrong!");
          }
      });
    }
< /script >

آموزش Asp.net MVC Core

در نهایت ما در این مقاله نحوه استفاده از Client Side Grid (DataTables Grid) را با ASP.NET Core MVC یاد گرفتیم. امیدوارم از مقاله لذت ببرید.

1396/08/15 6323 1639
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...