یکی از مواردی که درپروژهها زیاد مورد استفاده قرار میگیرد، نمایش دادههای ذخیره شدهی در بانک اطلاعاتی، به صورت صفحه بندی شده به کاربر میباشد. قبلا در زمینه بحث Paging،
مطلبی تهیه شده بود و در این مقاله قصد داریم کتابخانهای را مورد بررسی قرار دهیم که علاوه بر ارسال داده به صورت Ajax ایی، بتواند همچنین پارامترهای مورد نظر را به صورت Query String نیز در آدرس بار نمایش دهد.
اگر به جستجوی گوگل دقت کرده باشید، به صورت Ajax ایی پیاده سازی شدهاست، با این تفاوت که بعد از هر تغییر درجستجوی مورد نظر، Url صفحه نیز تغییر میکند (برای مثال بعد از جستجوی عبارت dotNetTips آدرس بار صفحه به شکل
https://www.google.com/#q=dotNetTips&* تغییر میکند). برای پیاده سازی این ویژگی باید از تکنیکی به نام HashChange استفاده کرد. در نتیجه با این روش مشکل ارسال صفحهای خاص در یک گرید برای دیگران، به صورت Ajax ایی و بدون مشکل انجام میشود. از این رو با توجه به داشتن Urlهای منحصر به فرد برای هر صفحه، تا حدی مشکل سئو سایت را نیز برطرف میکنیم.
برای استفاده از این ویژگی در ادامه قصد داریم پیاده سازی کتابخانهی
MvcAjaxPager را مورد بررسی قرار دهیم. ابتدا قبل از هر کاری، با استفاده از دستور زیر اقدام به نصب کتابخانه آن مینماییم:
Install-Package MvcAjaxPager
در ادامه نحوه پیاده سازی آن را به همراه مثالی، مورد بررسی قرار میدهیم:
ابتدا یک مدل فرضی را همانند زیر تهیه میکنیم :
public class Topic
{
public int Id;
public string Title;
public string Text;
}
و کلاسی را همانند زیر برای دریافت یک لیست از مطالب مینویسیم:
public class TopicService
{
public static IEnumerable<Topic> Topics = new List<Topic>() {
new Topic{Id=1,Title="Title 1",Text= "Text 1"},
new Topic{Id=2,Title="Title 2",Text="Text 2"},
new Topic{Id=3,Title="Title 3",Text="Text 3"},
new Topic{Id=4,Title="Title 4",Text="Text 4"},
new Topic{Id=5,Title="Title 5",Text="Text 5"},
new Topic{Id=6,Title="Title 6",Text="Text 6"},
new Topic{Id=7,Title="Title 7",Text="Text 7"},
new Topic{Id=8,Title="Title 8",Text="Text 8"},
new Topic{Id=9,Title="Title 9",Text="Text 9"},
new Topic{Id=10,Title="Title 10",Text="Text 10"},
new Topic{Id=11,Title="Title 11",Text="Text 11"},
new Topic{Id=12,Title="Title 12",Text="Text 12"},
new Topic{Id=13,Title="Title 13",Text="Text 13"},
new Topic{Id=14,Title="Title 14",Text="Text 14"},
new Topic{Id=15,Title="Title 15",Text="Text 15"},
new Topic{Id=16,Title="Title 16",Text="Text 16"},
new Topic{Id=17,Title="Title 17",Text="Text 17"},
new Topic{Id=18,Title="Title 18",Text="Text 18"},
new Topic{Id=19,Title="Title 19",Text="Text 19"},
new Topic{Id=20,Title="Title 20",Text="Text 20"},
new Topic{Id=21,Title="Title 21",Text="Text 21"},
new Topic{Id=22,Title="Title 22",Text="Text 22"},
};
public static IEnumerable<Topic> GetAll()
{
return Topics.OrderBy(row => row.Id);
}
}
همچنین کلاس زیر را اضافه میکنیم:
public class ListViewModel
{
public IEnumerable<Topic> Topics { get; set; }
public int PageIndex { get; set; }
public int TotalItemCount { get; set; }
}
ابتدا یک کنترلر را ایجاد میکنیم به همراه اکشن متدی که قصد داریم لیستی از اطلاعات را به کاربر نمایش دهیم:
public ActionResult Index(int page = 1)
{
var topics = TopicService.GetAll ();
int totalItemCount = topics.Count();
var model = new ListViewModel()
{
PageIndex = page,
Topics = topics.OrderBy(p => p.Id).Skip((page - 1) * 10).Take(10).ToList(),
TotalItemCount = totalItemCount
};
if (!Request.IsAjaxRequest())
{
return View(model);
}
return PartialView("_TopicList", model);
}
در اینجا بعد از واکشی اطلاعات، تعداد 10 رکورد را در هر صفحه نمایش میدهیم.
و در Partial view مربوطه نیز داریم :
@using MvcAjaxPager
@model ListViewModel
@Html.AjaxPager(Model.TotalItemCount, 10, Model.PageIndex, "Index", "Home", null, new PagerOptions
{
ShowDisabledPagerItems = true,
AlwaysShowFirstLastPageNumber = true,
HorizontalAlign = "center",
ShowFirstLast = false,
CssClass = "NavigationBox",
AjaxUpdateTargetId = "dvTopics",
AjaxOnBegin = "AjaxStart",
AjaxOnComplete = "AjaxStop"
}, null, null)
<table>
<tr>
<th>
@Html.DisplayName("ID")
</th>
<th>
@Html.DisplayName("Title")
</th>
<th>
@Html.DisplayName("Text")
</th>
</tr>
@foreach (var topic in Model.Topics)
{
<tr>
<td>
@topic.Id
</td>
<td>
@topic.Title
</td>
<td>
@topic.Text
</td>
</tr>
}
</table>
@Html.AjaxPager(Model.TotalItemCount, 10, Model.PageIndex, "Index", "Home", null, new PagerOptions
{
ShowDisabledPagerItems = true,
AlwaysShowFirstLastPageNumber = true,
HorizontalAlign = "center",
ShowFirstLast = true,
FirstPageText = "اولین",
LastPageText = "آخرین",
MorePageText = "...",
PrevPageText = "قبلی",
NextPageText = "بعدی",
CssClass = "NavigationBox",
AjaxUpdateTargetId = "dvTopics",
AjaxOnBegin = "AjaxStart",
AjaxOnComplete = "AjaxStop"
}, null, null)
حال برای استفاده از pager مورد نظر فقط کافیست متد AjaxPager آن را فراخوانی کنیم. این متد شامل 11 OverLoad مختلف هست.
در این قسمت TotalItemCount جمع کل رکوردها، PageSize تعداد رکوردهای هر صفحه و PageIndex آدرس صفحه جاری میباشد.
مهمترین بخش این pager که قابلیتهای زیادی را به کاربر میدهد، قسمت PagerOptions آن است و تعدادی از پارامترهای آن شامل AjaxOnBeginAjaxOnCompelte، AjaxOnSuccess ، AjaxOnFailure میتوان تعیین کرد تا بعد از شروع، وقوع خطا، موفقیت و یا خاتمه عملیات جاوا اسکریپتی، اجرا شود.
AlwaysShowFirstLastPageNumber جهت نمایش صفحه اول و آخر
FirstPageText جهت تعیین متن اولین صفحه
LastPageText جهت تعیین متن آخرین صفحه
CssClass ، Id جهت تعیین Id خاص
و در انتها، در view مربوطه داریم:
@using MvcAjaxPager
@model ListViewModel
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div id="dvTopics">
@{
@Html.Partial("_TopicList", Model);
}
</div>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery-1.7.2.min.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/path.min.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.pager-1.0.1.min.js")"></script>
<script type="text/javascript">
$('.NavigationBox').pager();
//pagination before start
function AjaxStart() {
console.log('Start AJAX call. Loading message can be shown');
}
// pagination - after request
function AjaxStop() {
console.log('Stop AJAX call. Loading message can be hidden');
};
</script>
</body>
</html>
در انتهای صفحه مورد نظر میبایست دو فایل جاوااسکریپتی jquerypager و Path را که هنگام نصب Pager، به برنامه اضافه شده اند، فراخوانی کنیم و با استفاده از CssClass یا Id که قبلا در بخش PagerOption تعیین کردیم، آن را انتخاب و متدpager را فراخوانی کنیم.