استفاده از اسکرول نامحدود (Infinite Scrolling Jquery) در MVC
پنجشنبه 11 شهریور 1395هدف از این مقاله ، آموزش طریقه استفاده ازاسکرول بی پایان در پروژه های ASP.Net MVC برای دریافت اطلاعات و داده ها از فایل های CSV و نمایش آنها بر روی صفحات وب ، است . هر زمانی که شما به سمت پایین scroll می کنید ، داده های بیشتری load خواهد شد و به صفحه ی شما اضافه خواهد شد .
معرفی :
راههای فراوانی برای بازیابی اطلاعات از یک پایگاه داده/فایل و نمایش اطلاعات آن بر روی صفحه وب ، وجود دارد . در این مورد خاص ، داده هایی که قصد بازیابی آنها از منبع را داریم ، بزرگ است . ما برای کاهش دادن پردازش loading ، از ویژگی شماره گذاری (pagination) برای loading استفاده خواهیم کرد .
به جای load کردن تمام داده های موجود ، ما برای بالا بردن کارایی صفحه هنگام load شدن ، قسمتی از رکورد ها را بازیابی میکنیم . هدف این مقاله ، آموزش دادن "چگونگی بازیابی اطلاعات از فایل های CSV با استفاده از Infinite Scrolling Jquery می باشد . "
روش کار بدین شرح است که ، در ابتدا ، در هنگام load شدن صفحه 25 رکورد را نمایش خواهیم داد ،و زمانی که کاربر به سمت پایین Scroll میکند 25 رکورد جدید به صفحه ضمیمه می شود . و اگر کاربر باز هم به سمت پایین Scroll کند ، این کار در حلقه قرار میگیرد و دائما انجام می شود .
پیش نیاز ها
• در حالت کلی برای اجرای کدهای خودتان نیاز به برنامه های زیر دارید :
○ Visual Studio 2015
○ IIS Configured on your PC
• تکنولوژی / منابع استفاده شده
○ ASP.NET MVC
○ Bootstrap
○ ( Jquery ( infiniteScroll
○ ( Students.csv ( data file, can find under App_Data\Students.csv
استفاده از کد :
به منظور پیاده سازی این ویژگی توسط خودتان ، میتوانید مراحل زیر را دنبال کنید . تلاش ما بر این است که تا حد امکان مسئله را با جزئیات کامل توضیح دهیم .
مرحله اول :
در مرحله اول برنامه Visual Studio را اجرا کرده و یک پروژه ASP.Net Web Application را بسازید و آن را نامگذاری کنید .
مرحله دوم :
یک Template Empty انتخاب کرده و تیک MVC را بزنید . باقی تنظیمات رو بدون اعمال تغییراتی بر روی آن رد کرده و ok را بزنید تا یک پروژه MVC برای ما ساخته شود .
مرحله سوم :
منابع زیر را به پروژه ای که ساخته اید ، اضافه کنید .
• فایل Students.csv را به فولدر App_Data اضافه کنید . که این فایل منبع اصلی برای بازیابی اطلاعات در برنامه شما است .
• فایل spin.gif را به فولدر Content اضافه کنید ، این یک فایل gift است که زمانی که کاربر به سمت پایین Scroll می کند و برنامه در حال واکشی اطلاعات است میتواند مورد استفاده قرار بگیرد .
• فایل infiniteScroll.js را به فولدر Scripts اضافه کنید . این فایل شامل کد Javascript می باشد که فراخوانی Ajax ای برای بارگذاری اطلاعات جدید را مدیریت می کند .
مرحله چهارم :
یک Controller با نام StudentController به پروژه اضافه کنید . این کار را میتوانید با کلیک راست کردن بر روی فولدر Controller و Add / Controller و سپس انتخاب MVC5 Controller - Empty ، انجام دهید. سپس کدهای زیر را اضافه کنید .
StudentController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MVC_InfiniteScroll_CSVLoadingData.Models;
namespace MVC_InfiniteScroll_CSVLoadingData.Controllers
{
public class StudentController : Controller
{
public const int rowsPerPage = 25;
public StudentController()
{
ViewBag.RecordsPerPage = rowsPerPage;
}
public ActionResult Index()
{
return RedirectToAction("GetStudents");
}
public ActionResult GetStudents(int? pageNum)
{
pageNum = pageNum ?? 0;
ViewBag.IsEndOfRecords = false;
if (Request.IsAjaxRequest())
{
var students = GetRowsForPage(pageNum.Value);
ViewBag.IsEndOfRecords = (students.Any()) && ((pageNum.Value * rowsPerPage) >= students.Last().Key);
return PartialView("_StudentRow", students);
}
else
{
LoadAllStudentsToSession();
ViewBag.Students = GetRowsForPage(pageNum.Value);
return View("Index");
}
}
public void LoadAllStudentsToSession()
{
var studentRepo = new StudentRepo();
var students = studentRepo.ListStudents();
int custIndex = 1;
Session["Students"] = students.ToDictionary(x => custIndex++, x => x);
ViewBag.TotalNumberCustomers = students.Count();
}
public Dictionary<int, Student> GetRowsForPage(int pageNum)
{
Dictionary<int, Student> students = (Session["Students"] as Dictionary<int, Student>);
int from = (pageNum * rowsPerPage);
int to = from + rowsPerPage;
return students
.Where(x => x.Key > from && x.Key <= to)
.OrderBy(x => x.Key)
.ToDictionary(x => x.Key, x => x.Value);
}
}
}
مرحله پنجم :
برای صفحه خود layout ی بسازید ، بر روی فولدر View راست کلیک کنید و یک فولدر جدید با نام Shared به آن اضافه کنید . فایل هایی کخ در این فولدر قرار میگیرند برای همه مشترک است و بارها مورد استفاده قرار می گیرد .
روی فولدر Shared راست کلیک کرده و یک layout با نام _Layout.cshtml بسازید
((Add \ MVC 5 Layout Page (Razor) ، و کدهای زیر را در آن قرار دهید .
Layout.cshtml_
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>@ViewBag.Title - MVC Demo</title>
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/bootstrap.min.js"></script>
<link href="~/Content/bootstrap.min.css" rel="stylesheet" />
<link href="~/Content/Site.css" rel="stylesheet" />
</head>
<body>
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
@Html.ActionLink("MVC Scroll Demo", "Index", "Student", routeValues: null, htmlAttributes: new { @class = "navbar-brand" })
</div>
<div class="navbar-collapse collapse navbar-responsive-collapse">
<ul class="nav navbar-nav">
@*<li>@Html.ActionLink("<table> and <tr>", "Index", "Home")</li>
<li>@Html.ActionLink("<ul> and <li>", "Index", "UL")</li>*@
</ul>
</div>
</div>
</div>
<div class="container body-content">
@RenderBody()
<hr />
<footer>
<p>Iman@gmail.com © @DateTime.Now.Year </p>
</footer>
</div>
@RenderSection("scripts", required: false)
</body>
</html>
مورد بعدی که باید آن را انجام دهید ، ساختن دو تا Partial است . روی فولدر Shared راست کلیک کرده و دوتا partail با نام های Loading.cshtml / _studentRow.cshtml_ را به پروژه اضافه کنید .
Loading.cshtml_
وظیفه این فایل نمایش دادن فایل gif در زمان های مورد نیاز است .
<div id="loading">
<img src='~/Content/spin.gif' /><p><b>Loading the next @ViewBag.RecordsPerPage…</b></p>
</div>
studentRow.cshtml_
این فایل اطلاعات دانش آموزان را همانند یک حلقه بازیابی میکند .
@model Dictionary<int, MVC_InfiniteScroll_CSVLoadingData.Models.Student>
@foreach (var stu in Model)
{
<tr>
<td>@stu.Key </td>
<td>@stu.Value.ID</td>
<td>@stu.Value.Name</td>
<td>@stu.Value.Email</td>
</tr>
}
مرحله ششم :
فایل StudentController.cs را باز کنید ، روی Index کیلیک راست کرده و Add View را بزنید . پنجره ای نمایش داده خواهد ، در اینجا View خود را نامگذاری کنید ، نام آن را Index بگذارید . template ما empty است ، تیک "Create as a partial view" را بردارید و تیک گزینه "Use a layout page" را بزنید ، سپس یک layout انتخاب کنید . برای مثال ، Views/Shared/_Layout.cshtml/~ .
Add را بزنید تا view ساخته شود ، مشاهده خواهید کرد که یک view جدید به پروژه اضافه خواهد شد .
(Views \ Student\ Index.cshtml)
مرحله هفتم :
در این مرحله ما به سراغ ایجاد یک filterConfig سفارشی ، برای مدیریت خطا ، خواهیم رفت . کدهای زیر را در App_Start قرار دهید .
FilterConfig.cs
using System.Web.Mvc;
namespace MVC_InfiniteScroll_CSVLoadingData.App_Start
{
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
}
}
فایل RouteConfig.cs را با کدهای زیر بروزرسانی کنید .
RouteConfig.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MVC_InfiniteScroll_CSVLoadingData
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute("StudentList", "", new { controller = "Student", action = "GetStudents" });
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
}
مرحله هشتم :
بر روی فولدر Script راست کلیک کرده و یک فایل Javascript جدید با نام infiniteScroll.js را به پروژه اضافه کنید . این فایل Scroll به سمت پایین را مدیریت خواهد کرد .
infiniteScroll.js
var page = 0,
inCallback = false,
hasReachedEndOfInfiniteScroll = false;
var scrollHandler = function () {
if (hasReachedEndOfInfiniteScroll == false &&
($(window).scrollTop() == $(document).height() - $(window).height())) {
loadMoreToInfiniteScrollTable(moreRowsUrl);
}
}
function loadMoreToInfiniteScrollTable(loadMoreRowsUrl) {
if (page > -1 && !inCallback) {
inCallback = true;
page++;
$("div#loading").show();
$.ajax({
type: 'GET',
url: loadMoreRowsUrl,
data: "pageNum=" + page,
success: function (data, textstatus) {
if (data != '') {
$("table.infinite-scroll > tbody").append(data);
$("table.infinite-scroll > tbody > tr:even").addClass("alt-row-class");
$("table.infinite-scroll > tbody > tr:odd").removeClass("alt-row-class");
}
else {
page = -1;
}
inCallback = false;
$("div#loading").hide();
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
}
});
}
}
function showNoMoreRecords() {
hasReachedEndOfInfiniteScroll = true;
}
مرحله نهم :
برنامه را Build کنید ، سپس آن را اجرا و خروجی را مشاهده کنید .

امیدواریم که این مقاله برای شما مفید واقع شده باشد .
آموزش asp.net mvc
- ASP.net MVC
- 2k بازدید
- 7 تشکر