پیاده سازی جستجو و صفحه بندی و مرتب کردن داده ها بر اساس حروف الفبا در MVC

یکشنبه 10 خرداد 1394

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

پیاده سازی  جستجو و صفحه بندی و مرتب کردن داده ها بر اساس حروف الفبا در MVC

 سلام دوستان

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

برای شروع به کار ابتدا در SQL Server یک بانک اطلاعاتی به نام db_Students  و یک جدول با نام  Students  ایجاد میکنیم و شروع به ثبت داده به صورت دستی میکنیم

و همان طور که مشاهده میکنید ما قصد داریم نام تعدادی از  دانشجویان را بگیریم و براساس  درس  ، جنسیت و اسم ،شروع به مرتب سازی و صفحه بندی و جستجو کنیم

 

مرحله 1:

ایتدا  ویژوال استادیو را باز کرده و یک پروژه از نوع MVC 5Web application  ایجاد میکنیم

مرحله 2

 سپس  همانند زیر یک پروژه از نوع  Empty انتخاب کرده ، و در پایین تیک Mvc را زده و Ok میکنیم

 

 

حال شما در این مرحله یک پروژه خالی  از نوع MVc  دارید

مرحله3:

  دراین مرحله روی Modles راست کلیک کرده و در گزینه     New Item ، Addرا انتخاب  کرده و گزینه ADO.NET Entity Data Model رابرای اضافه کردن  بانک اطلاعاتی به برنامه خود انتخاب میکنیم

در این مرحله ابتدا EF Designer را انتخاب کرده و Next را میزنیم

 

 روی New Connection کلیک کرده

 

 دراین مرحله باید نام بانک  اطلاعاتی را که در Sql  ساختیم را انتخاب کنید

اگر آشنایی کافی به گزینه های این صفحه ندارید کافی است اینجا کلیک کنید

 

 

در این مرحله نام جدولی که  را که در sql ساختیم را انتخاب میکنیم و در آخر گزینه Finish  را میزنیم

در این تصویر جدولی را که ساخته یم را در ORM مشاهده میکنید

مرحله 4:

دراین مرحله یک Controller  از نوع    Empty به نام Home  ایجاد میکنیم

مرحله 5

 در این  مرحله وقت اضافه کردن مدل به برنامه خوداست برای اینکار ابتدا بایستی فضای نام SearchSortPaging.Models به برنامه اضافه کینم (همان طور که میدانید SearchSortPaging اسم Solution   برنامه است)

حال  در این مرحله یک نمونه از بانک اطلاعاتی ، و لیستی از جدول خود میسازیم و همه آن ها را داخل یک View قرار میدهیم

    public class HomeController: Controller {  
      
        //create a StudentsDbContext object  
        StudentsDbContext db = new StudentsDbContext();  
        public ActionResult Index() {  
            //the StudentsDbContext object has got a property Students which will give us all the student records back. Convert it into a list  
      
            List < Student > StudentList = db.Students.ToList();  
            //pass the StudentList list object to the view.  
            return View(StudentList);  
        }  
    }

در این مرحله یک View ،  که میخواهیم  لیستی از     اطلاعات جدول student  در آن باشد را ایجاد میکنیم

 

حال از اینجا به بعد نوبت پیاده سازی توابع جستجو ، صفحه بندی ، و مرتب سازی است که مرحله به مرحله هرکدام را  توضیح میدهم

 

مرحله 1: پیاده  سازی تابع جستجو:

برای پیاده  سازی "جستجو" بایستی تغیراتی در صفحه Index ، View خود بدهیم

    @model IEnumerable < SearchSortPaging.Models.Student >  
      
    @ {  
        ViewBag.Title = "Index";  
    }  
      
    @ * Html.BeginForm is used to add a form in an Html document * @@ * Pass the action name in the first parameter, controller name in the second parameter and specify the form request type as get * @  
      
    @using(Html.BeginForm("Index", "Home", FormMethod.Get)) {  
        //the following are search options  
        <  
        b > Search Option: < /b>@Html.RadioButton("option", "Name") <text>Name</text > @Html.RadioButton("option", "Gender") < text > Gender < /text>  
    @Html.RadioButton("option", "Subjects")<text>Subject</text > @Html.TextBox("search") < input type = "submit"  
        name = "submit"  
        value = "Search" / >  
    }

فقط این نکته رایادآوری کنم که کد های بالا بایستی قبل از تگ های <table>   باشد

در این مرحله در قسمت کنترلر میریم و کد های زیر را به متدد Index اضافه میکنیم

public ActionResult Index(string option, string search) {  
  
    //if a user choose the radio button option as Subject  
    if (option == "Subjects") {  
        //Index action method will return a view with a student records based on what a user specify the value in textbox  
        return View(db.Students.Where(x = > x.Subjects == search || search == null).ToList());  
    } else if (option == "Gender") {  
        return View(db.Students.Where(x = > x.Gender == search || search == null).ToList());  
    } else {  
        return View(db.Students.Where(x = > x.Name.StartsWith(search) || search == null).ToList());  
    }  
}  

 

و در این مرحله از برنامه اجرا بگیرید

 

همان طور که در تصویر زیر میبیند من میخواهم یکی از جنسیت ها  را انتخاب کنم ابتدا گزینه "جنسیت " را میزنم  و کلمه "مرد" را درقسمت جستجو انتخاب میکنم  میبیند که میبیند لیستی از مردها را به نمایش گذاشته میشود

 

حال باید کاری کنیم که اگر کاربر داداه هایی را در گزینه جستجو زد که  در داده های ما نبود باید یک پیغام با این مضمون نشان دهیم که  "دادهای با این مشخصات وجود ندارد "

    @ * Here our model is IEnumerable of Students.So, we can check  
    if the Model.Count() method value is 0.  
    If the value is 0 then we know  
    for sure that it will  
    return an empty record * @  
      
    @  
    if (Model.Count() == 0) { < tr > < td colspan = "3" > Records not found < /td>  
    </tr >  
    } else {  
      
        foreach(var item in Model) { < tr > < td > @Html.DisplayFor(modelItem = > item.Name) < /td>  
    <td>  
    @Html.DisplayFor(modelItem => item.Gender)  
    </td > < td > @Html.DisplayFor(modelItem = > item.Subjects) < /td>  
    </tr >  
        }  
    }

حال نویت پیاده سازی صفحه بندی است

برای پیاده سازی صفحه بندی نیاز  به نصب PagedList.Mvc  داریم برای نصب ، نیاز داریم از >NuGet package manager. استفاده کنیم

سپس در قسمت جستجو ، PagedList.Mvc را جستجو کرده و درآخر گزینه Install را میزنیم

 

حال  به کنترلر خود رفته واز  فضای نام using PagedList; استفاده میکنیم

 

public ActionResult Index(string option, string search, int? pageNumber) {  
if(option == "Subjects") {  
return View(db.Students.Where(x => x.Subjects == search || search == null).ToList().ToPagedList(pageNumber ?? 1, 3));  
}  
else if(option == "Gender") {  
return View(db.Students.Where(x => x.Gender == search || search == null).ToList().ToPagedList(pageNumber ?? 1, 3));  
}  
else {  
return View(db.Students.Where(x => x.Name.StartsWith(search) || search == null).ToList().ToPagedList(pageNumber ?? 1, 3));  
}   

همان طور که میبنید دوتا عدد در پارامتر ToPagedList قرار دادم که اولی برای این است که صفحه بندی از چه عددی شروع شود و دومی برای آن است که چه تعداد داده  در صفحه ما به نمایش گذاشته شود  

در این مرحله لازم است که تغیراتی درView خود بدهیم  در View خود به جای  اینترفیس IEnumerable  از اینترفیس  IpagedList استفاده میکنیم

    @using PagedList;  
      
    @using PagedList.Mvc;  
      
    @model IPagedList<SearchSortPaging.Models.Student>  
      
      
    <table class="table" border="1">  
    <tr>  
    <th>  
    @Html.DisplayNameFor(model => model.First().Name)  
    </th>  
    <th>  
    @Html.DisplayNameFor(model => model.First().Gender)  
    </th>  
    <th>  
    @Html.DisplayNameFor(model => model.First().Subjects)  
    </th>  
    </tr>

در این مرحله  تنها 3 تا رکورد اول را میبینید ما باید در برنامه خود از صفحه بندی ای استفاده کنیم که در هر صفحه 3تا رکود اضافه کنیم ،   برای این کار کافی است کد زیر را در view خود اضافه کنید

 

میتوان این امکان را نیز اضافه کرد که عدد صفحه مربوطه در Url  دیده شود .قطعه کد زیر اینکار را انجام میدهد

    @Html.PagedListPager(Model,pageNumber => Url.Action("Index",new{  
    pageNumber  
    }))

 

اکنون اگر شما یکی از گزینه های جستجو، مثل جنسیت را بزنید و مرد ها  یا زن ها را در texBox،جستجو بنویسید و سپس enter را برنید  به ازای تعداد مقداری که  در جستجو وارد کردید  ، صفحه ایجاد میکند

 

حال میتوان در URL  علاوه بر شماره صفحه، نوع گزینه ای که جستجو شده (جنسیت،نام،نام درس)و مورد جستجو شده  را به نمایش بگذاریم  برای این کار کافی است از کد زیر در View  خود استفاده کنیم

    @Html.PagedListPager(Model,pageNumber => Url.Action("Index",new{  
    pageNumber,  
    option = Request.QueryString["option"],  
    search = Request.QueryString["search"]  
    }))

و قسمت کامل شده View  برای صفحه بندی به شرح زیر میباشد (که در بالا مرحله به مرحله توضیح داده شده است)

    @using PagedList;  
      
    @using PagedList.Mvc;  
      
    @model IPagedList < SearchSortPaging.Models.Student > < link href = "~/Content/PagedList.css"  
    rel = "stylesheet" / > @ {  
        ViewBag.Title = "Index";  
    }  
    @using(Html.BeginForm("Index", "Home", FormMethod.Get)) { < b > Search Option: < /b>@Html.RadioButton("option", "Name") <text>Name</text > @Html.RadioButton("option", "Gender") < text > Gender < /text>  
    @Html.RadioButton("option", "Subjects")<text>Subject</text > @Html.TextBox("search") < input type = "submit"  
        name = "submit"  
        value = "Search" / >  
    } < table class = "table"  
    border = "1" > < tr > < th > @Html.DisplayNameFor(model = > model.First().Name) < /th>  
    <th>  
    @Html.DisplayNameFor(model => model.First().Gender)  
    </th > < th > @Html.DisplayNameFor(model = > model.First().Subjects) < /th>  
    </tr >  
      
    @  
    if (Model.Count() == 0) { < tr > < td colspan = "3" > Records not found < /td>  
    </tr >  
    } else {  
      
        foreach(var item in Model) { < tr > < td > @Html.DisplayFor(modelItem = > item.Name) < /td>  
    <td>  
    @Html.DisplayFor(modelItem => item.Gender)  
    </td > < td > @Html.DisplayFor(modelItem = > item.Subjects) < /td>  
    </tr >  
        }  
    } < /table>  
      
    @Html.PagedListPager(Model, pageNumber => Url.Action("Index", new {  
    pageNumber,  
    option = Request.QueryString["option"],  
    search = Request.QueryString["search"]  
    }))

 

 

و اکنون نوبت مرتب سازی داده هاست در این برنامه ،ما تنها 9 داده در جدول خود داریم ولی دریک برنامه واقعی شاید هزاران داده در برنامه داشته باشیم و هر داده خود دارای قسمت های مختلف باشد که  بهتر است در برنامه تمام داده ها برا اساس حروف الفبا باشد  دراین مرحله ما به مرتب سازی داده هایمان مپردازیم .

در متد Index یک پارامتر ورودی دیگری برای مرتب سازی میدهیم

    using PagedList;  
    using SearchSortPaging.Models;  
    using System.Linq;  
    using System.Web.Mvc;  
      
    namespace SearchSortPaging.Controllers {  
        public class HomeController: Controller {  
            StudentsDbContext db = new StudentsDbContext();  
      
            //add a fourth parameter  
            public ActionResult Index(string option, string search, int ? pageNumber, string sort) {  
      
                //if the sort parameter is null or empty then we are initializing the value as descending name  
                ViewBag.SortByName = string.IsNullOrEmpty(sort) ? "descending name" : "";  
                //if the sort value is gender then we are initializing the value as descending gender  
                ViewBag.SortByGender = sort == "Gender" ? "descending gender" : "Gender";  
      
                //here we are converting the db.Students to AsQueryable so that we can invoke all the extension methods on variable records.  
                var records = db.Students.AsQueryable();  
      
                if (option == "Subjects") {  
                    records = records.Where(x = > x.Subjects == search || search == null);  
                } else if (option == "Gender") {  
                    records = records.Where(x = > x.Gender == search || search == null);  
                } else {  
                    records = records.Where(x = > x.Name.StartsWith(search) || search == null);  
                }  
      
                switch (sort) {  
      
                    case "descending name":  
                        records = records.OrderByDescending(x = > x.Name);  
                        break;  
      
                    case "descending gender":  
                        records = records.OrderByDescending(x = > x.Gender);  
                        break;  
      
                    case "Gender":  
                        records = records.OrderBy(x = > x.Gender);  
                        break;  
      
                    default:  
                        records = records.OrderBy(x = > x.Name);  
                        break;  
      
                }  
                return View(records.ToPagedList(pageNumber ? ? 1, 3));  
            }  
        }  
    }

در کد بالا من از دوتا ViewBag برای مرتب سازی به صورت نزولی برای اسم و جنیست استفاده کردم

و  کمی تغیرات در قسمت view انجام میدهیم

    @using PagedList;  
      
    @using PagedList.Mvc;  
      
    @model IPagedList < SearchSortPaging.Models.Student > < link href = "~/Content/PagedList.css"  
    rel = "stylesheet" / > @ {  
        ViewBag.Title = "Index";  
    }  
      
      
    @using(Html.BeginForm("Index", "Home", FormMethod.Get)) {  
      
        < b > Search Option: < /b>@Html.RadioButton("option", "Name") <text>Name</text > @Html.RadioButton("option", "Gender") < text > Gender < /text>  
    @Html.RadioButton("option", "Subjects")<text>Subject</text > @Html.TextBox("search") < input type = "submit"  
        name = "submit"  
        value = "Search" / >  
    } < table class = "table"  
    border = "1" > < tr > < th > @Html.ActionLink("Name", "Index", new {  
        sort = ViewBag.SortByName, option = Request.QueryString["option"], search = Request.QueryString["search"]  
    }) < /th>  
    <th>  
    @Html.ActionLink("Gender", "Index", new { sort = ViewBag.SortByGender, option = Request.QueryString["option"], search = Request.QueryString["search"] })  
    </th > < th > @Html.DisplayNameFor(model = > model.First().Subjects) < /th>  
    </tr >  
      
    @  
    if (Model.Count() == 0) { < tr > < td colspan = "3" > Records not found < /td>  
    </tr >  
    } else {  
      
        foreach(var item in Model) { < tr > < td > @Html.DisplayFor(modelItem = > item.Name) < /td>  
    <td>  
    @Html.DisplayFor(modelItem => item.Gender)  
    </td > < td > @Html.DisplayFor(modelItem = > item.Subjects) < /td>  
    </tr >  
        }  
    } < /table>  
      
    @Html.PagedListPager(Model, pageNumber => Url.Action("Index", new {  
    pageNumber,  
    option = Request.QueryString["option"],  
    search = Request.QueryString["search"],  
    sort = Request.QueryString["sort"]  
    }))

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

 

  موفق باشید

 

 

 

 

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

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

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید