صفحه بندی و مرتب سازی خودکار اطلاعات به کمک jqGrid در ASP.NET MVC
نویسنده: وحید نصیری
تاریخ: ۱۳۹۳/۰۴/۱۱ ۱۲:۴۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
PM> Install-Package Trirand.jqGrid
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>@ViewBag.Title - My ASP.NET Application</title>
<link href="~/Content/themes/base/jquery.ui.all.css" rel="stylesheet" />
<link href="~/Content/jquery.jqGrid/ui.jqgrid.css" rel="stylesheet" />
<link href="~/Content/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div>
@RenderBody()
</div>
<script src="~/Scripts/jquery-1.7.2.min.js"></script>
<script src="~/Scripts/jquery-ui-1.8.11.min.js"></script>
<script src="~/Scripts/i18n/grid.locale-fa.js"></script>
<script src="~/Scripts/jquery.jqGrid.min.js"></script>
@RenderSection("Scripts", required: false)
</body>
</html> .ui-widget {
}
/*how to move jQuery dialog close (X) button from right to left*/
.ui-jqgrid .ui-jqgrid-caption-rtl {
text-align: center !important;
}
.ui-dialog .ui-dialog-titlebar-close {
left: .3em !important;
}
.ui-dialog .ui-dialog-title {
margin: .1em 0 .1em .8em !important;
direction: rtl !important;
float: right !important;
} namespace jqGrid01.Models
{
public class Product
{
public int Id { set; get; }
public string Name { set; get; }
public decimal Price { set; get; }
public bool IsAvailable { set; get; }
}
} using System.Collections.Generic;
namespace jqGrid01.Models
{
public class JqGridData
{
public int Total { get; set; }
public int Page { get; set; }
public int Records { get; set; }
public IList<JqGridRowData> Rows { get; set; }
public object UserData { get; set; }
}
public class JqGridRowData
{
public int Id { set; get; }
public IList<string> RowCells { set; get; }
}
} @{
ViewBag.Title = "Index";
}
<div dir="rtl" align="center">
<div id="rsperror"></div>
<table id="list" cellpadding="0" cellspacing="0"></table>
<div id="pager" style="text-align:center;"></div>
</div>
@section Scripts
{
<script type="text/javascript">
$(document).ready(function () {
$('#list').jqGrid({
caption: "آزمایش اول",
//url from wich data should be requested
url: '@Url.Action("GetProducts","Home")',
//type of data
datatype: 'json',
jsonReader: {
root: "Rows",
page: "Page",
total: "Total",
records: "Records",
repeatitems: true,
userdata: "UserData",
id: "Id",
cell: "RowCells"
},
//url access method type
mtype: 'GET',
//columns names
colNames: ['شماره', 'نام محصول', 'موجود است', 'قیمت'],
//columns model
colModel: [
{ name: 'Id', index: 'Id', align: 'right', width: 50, sorttype: "number" },
{ name: 'Name', index: 'Name', align: 'right', width: 300 },
{ name: 'IsAvailable', index: 'IsAvailable', align: 'center', width: 100, formatter: 'checkbox' },
{ name: 'Price', index: 'Price', align: 'center', width: 100, sorttype: "number" }
],
//pager for grid
pager: $('#pager'),
//number of rows per page
rowNum: 10,
rowList: [10, 20, 50, 100],
//initial sorting column
sortname: 'Id',
//initial sorting direction
sortorder: 'asc',
//we want to display total records count
viewrecords: true,
altRows: true,
shrinkToFit: true,
width: 'auto',
height: 'auto',
hidegrid: false,
direction: "rtl",
gridview: true,
rownumbers: true,
footerrow: true,
userDataOnFooter: true,
loadComplete: function() {
//change alternate rows color
$("tr.jqgrow:odd").css("background", "#E0E0E0");
},
loadError: function(xhr, st, err) {
jQuery("#rsperror").html("Type: " + st + "; Response: " + xhr.status + " " + xhr.statusText);
}
//, loadonce: true
})
.jqGrid('navGrid', "#pager",
{
edit: false, add: false, del: false, search: false,
refresh: true
})
.jqGrid('navButtonAdd', '#pager',
{
caption: "تنظیم نمایش ستونها", title: "Reorder Columns",
onClickButton: function() {
jQuery("#list").jqGrid('columnChooser');
}
});
});
</script>
}
ts.p.jsonReader = $.extend(true,{
root: "rows",
page: "page",
total: "total",
records: "records",
repeatitems: true,
cell: "cell",
id: "id",
userdata: "userdata",
subgrid: {root:"rows", repeatitems: true, cell:"cell"}
},ts.p.jsonReader);
PM> Install-Package DynamicQuery
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web.Mvc;
using jqGrid01.Models;
using jqGrid01.Extensions; // for dynamic OrderBy
namespace jqGrid01.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult GetProducts(string sidx, string sord, int page, int rows)
{
var list = ProductDataSource.LatestProducts;
var pageIndex = page - 1;
var pageSize = rows;
var totalRecords = list.Count;
var totalPages = (int)Math.Ceiling(totalRecords / (float)pageSize);
var products = list.AsQueryable()
.OrderBy(sidx + " " + sord)
.Skip(pageIndex * pageSize)
.Take(pageSize)
.ToList();
var jqGridData = new JqGridData
{
UserData = new // نمایش در فوتر
{
Name = "جمع صفحه",
Price = products.Sum(x => x.Price)
},
Total = totalPages,
Page = page,
Records = totalRecords,
Rows = (products.Select(product => new JqGridRowData
{
Id = product.Id,
RowCells = new List<string>
{
product.Id.ToString(CultureInfo.InvariantCulture),
product.Name,
product.IsAvailable.ToString(),
product.Price.ToString(CultureInfo.InvariantCulture)
}
})).ToList()
};
return Json(jqGridData, JsonRequestBehavior.AllowGet);
}
}
}
.ui-jqgrid .ui-jqgrid-hbox-rtl {float: right; padding-left: 0;}
.jqGrid('navButtonAdd', '#pager',
{
caption: "تنظیم نمایش ستونها", title: "Reorder Columns",
onClickButton: function () {
jQuery("#list").jqGrid('columnChooser', {
done: function (perm) {
if (perm) {
$("#list").jqGrid("remapColumns", perm, true, false);
}
var colModel = $("#list").jqGrid('getGridParam', 'colModel');
var hiddenColumns = new Array();
for (var i = 0; i < colModel.length; i++) {
if (colModel[i].hidden) {
hiddenColumns.push(colModel[i].name);
}
}
$.ajax({
type: "POST",
url: "@Url.Action("HiddenColumns","Home")",
dataType: "json",
traditional: true,
data: { hiddenColumns: hiddenColumns }
});
}
});
}
}) var colModel = $("#list").jqGrid('getGridParam', 'colModel'); public ActionResult HiddenColumns(string[] hiddenColumns)
{
//todo: save it in the DB or cookies or session ....
return Content("OK");
} function getHiddenColumnsList() {
var colModel = $("#list").jqGrid('getGridParam', 'colModel');
var hiddenColumns = new Array();
if (!colModel)
return hiddenColumns;
for (var i = 0; i < colModel.length; i++) {
if (colModel[i].hidden) {
hiddenColumns.push(colModel[i].name) ;
}
}
return hiddenColumns;
}
$(document).ready(function () {
$('#list').jqGrid({
// ...
postData: { 'hiddenColumns': function() { return getHiddenColumnsList(); } }
// ...
});
}); column.IsVisible(hiddenColumns.Split(',').All(col => col != "Id"));
jQuery("#list").trigger("reloadGrid"); function loadGrid() {
$('#list').jqGrid({
caption: "آزمایش اول",
// .....
});
} <button onclick="loadGrid()">Load Grid</button>
PM> Install-Package System.Linq.Dynamic.Library
3. Can be used in proprietary works The license policy allow you to use this piece of code even inside commercial (not open source) projects. So you can use this software without giving away your own (precious?) source code.
public enum publishStatus
{
[Display(Name = "نمایش داده شود")]
show = 0,
[Display(Name = "مخفی باشد")]
hidden = 1
} {
resize: false, formatter: buttons
} function buttons(cellvalue, options, rowObject) {
var addProjectUrl = $('#getAddProjectUrl').data('url') + "/" + options.rowId;
return "<a href=" + addProjectUrl + ">....
} index: ' (StronglyTyped.PropertyName<StateCityViewModel>(x => x.CityName))', public async Task<DataGridViewModel<StateCityViewModel>> GetDataGridSource(string orderBy, JqGridRequest request, NameValueCollection form, DateTimeType dateTimeType,
int page, int pageSize)
{
var query = _stateCity.AsQueryable();
query = new JqGridSearch(request, form, dateTimeType).ApplyFilter(query);
var resultsToSkip = page * pageSize;
var dataGridModel = new DataGridViewModel<StateCityViewModel>
{
Records = await query.AsQueryable().OrderBy(orderBy)
.Skip(() => resultsToSkip)
.Take(pageSize).ProjectTo<StateCityViewModel>(null, _mappingEngine).ToListAsync(),
TotalCount = await query.AsQueryable().OrderBy(orderBy).CountAsync()
};
return dataGridModel;
}
همینطور بستهی نیوگت Microsoft.AspNetCore.Mvc.NewtonsoftJson را هم برای بخشی که اطلاعات به صورت json به صفحه ارسال میشه نصب کردم ولی اطلاعات رو در جداول نمایش نمیده.
روی ASP.NET Core 2.2 به خوبی کار میکرد ولی با ارتقا به ASP . NET Core 3.0 این مشکل پیش اومده.
کار خاص دیگرهم باید انجام بدیم؟
ممنون میشم راهنمایی بفرمایید.
<script type="text/javascript">
$(function() {
$('#jqgStarWarsCharacters').jqGrid({
url: '@Url.Action("Characters", "StarWars")',
datatype: 'json',
mtype: 'POST',
cmTemplate: { align: 'center' },
colNames: [ 'Name', 'Gender', 'Height', 'Weight', 'Birth Year', 'Skin Color', 'Hair Color', 'Eye Color' ],
colModel: [
{ name: 'Name' },
{ name: 'Gender', sortable: false, formatter: demo.jqGrid.character.genderFormatter },
{ name: 'Height', summaryType: 'avg' },
{ name: 'Weight', summaryType: 'avg' },
{ name: 'BirthYear' },
{ name: 'SkinColor', sortable: false, formatter: demo.jqGrid.character.skinColorFormatter },
{ name: 'HairColor', sortable: false, formatter: demo.jqGrid.character.hairColorFormatter },
{ name: 'EyeColor', sortable: false, formatter: demo.jqGrid.character.eyeColorFormatter }
],
caption: 'StarWars Characters',
grouping: true,
groupingView: {
groupField: ['Gender'],
groupDataSorted: true,
groupColumnShow: [false],
groupSummary: [true]
},
footerrow: true,
userDataOnFooter: true,
jsonReader: { repeatitems: false, id: 'Id' },
pager: $('#jqgpStarWarsCharacters'),
rowNum: 100,
sortname: 'Id',
sortorder: 'asc',
viewrecords: true,
height: '100%'
});
});
</script>
توی startup پروژه هم با ارتقا به Core 3.0 متدها به صورت زیر نوشته شده که متد UseMVC قبلی رو حذف کردم
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddRazorPages();
services.AddControllers()
.AddNewtonsoftJson();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
JqGridRequest.ParametersNames = new JqGridParametersNames() { PagesCount = "npage" };
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapDefaultControllerRoute();
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=JavaScript}/{action=Basics}");
endpoints.MapControllerRoute(
name: "default2",
pattern: "{controller=StarWars}/{action=Characters}/{id?}");
endpoints.MapRazorPages();
});
}
$("#contactsList").jqGrid({
mtype: 'POST',
ajaxGridOptions: { contentType: 'application/json; charset=utf-8' }, $.extend($.jgrid.defaults, {
datatype: 'json',
ajaxGridOptions: { contentType: "application/json" },
ajaxRowOptions: { contentType: "application/json", type: "PUT" },
ajaxSelectOptions: { contentType: "application/json", dataType: "JSON" }
});
$.extend($.jgrid.edit, {
ajaxEditOptions: { contentType: "application/json" },
recreateForm: true,
serializeEditData: function(postData) {
return JSON.stringify(postData);
}
});
$.extend($.jgrid.del, {
ajaxDelOptions: { contentType: "application/json" },
mtype: "DELETE"
});
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
JqGridRequest.ParametersNames = new JqGridParametersNames() { PagesCount = "npage" };
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=JavaScript}/{action=Basics}/{id?}");
endpoints.MapControllerRoute(
name: "default2",
pattern: "{controller=StarWars}/{action=Characters}");
endpoints.MapRazorPages();
});
} Could not load type 'Microsoft.AspNetCore.Mvc.ModelBinding.Internal.ModelBindingHelper'
from assembly 'Microsoft.AspNetCore.Mvc.Core, Version=3.0.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'.
سورس پروژه رو با این تغییرات در گیتهاب هم منتشر کردم