فهرست کردن،مرتب کردن و جستجوکردن داده ها و صفحه گذاری در Asp.net Mvc5

یکشنبه 8 تیر 1393

مثالی برای فهرست کردن،مرتب کردن و جستجوکردن داده ها و صفحه گذاری در Asp.net Mvc5

 فهرست کردن،مرتب کردن و جستجوکردن داده ها و صفحه گذاری در Asp.net Mvc5

هدف از این مقاله نشان دادن یک فهرست از داده ها و مرتب کردن و جستجو کردن داده ها و صفحه گذاری است.

ابتدا nuget Package  را برای PagedList.MVC  نصب کنید.https://www.nuget.org/packages/PagedList.Mvc/

کد های تکمیلی

کنترولر Products:

public class ProductsController : Controller
    {
        private readonly ICommandBus _commandBus;
        private readonly IBrandRepository _brandRepository;
        private readonly ICategoryRepository _categoryRepository;
        private readonly IProductRepository _productRepository;
        private readonly IProductImageRepository _productImageRepository;
        private readonly IUserRepository _userRepository;
        private const int PageSize = 10;

        public ProductsController(ICommandBus commandBus,
                                    IBrandRepository brandRepository,
                                    ICategoryRepository categoryRepository,
                                    IProductRepository productRepository, 
                                    IProductImageRepository productImageRepository,
                                    IUserRepository userRepository)
        {
            _commandBus = commandBus;
            _brandRepository = brandRepository;
            _categoryRepository = categoryRepository;
            _productRepository = productRepository;
            _productImageRepository = productImageRepository;
            _userRepository = userRepository;
        }

        public ActionResult Index(string sortOrder, string currentFilter, string searchByName,string searchByDescription, string searchByUser, string searchByBrand, string searchByCategory, int? page)
        {
            if (searchByName != null)
            {
                page = 1;
            }
            else
            {
                searchByName = currentFilter;
            }

            var efmvcUser = HttpContext.User.GetEFMVCUser();
            var user = _userRepository.GetById(efmvcUser.UserId);

            SetCollectionForFilter(user);

            ViewBag.CurrentSort = sortOrder;
            ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "NameDesc" : "";
            ViewBag.DescriptionSortParm = sortOrder == "Description" ? "DescriptionDesc" : "Description";
            ViewBag.UserSortParm = sortOrder == "User" ? "UserDesc" : "User";
            ViewBag.PriceSortParm = sortOrder == "Price" ? "PriceDesc" : "Price";
            ViewBag.CategorySortParm = sortOrder == "Category" ? "CategoryDesc" : "Category";
            ViewBag.BrandSortParm = sortOrder == "Brand" ? "BrandDesc" : "Brand";

            ViewBag.CurrentFilter = searchByName;
            ViewBag.DescriptionFilter = searchByDescription;
            ViewBag.UserParam = searchByUser;
            ViewBag.BrandParam = searchByBrand;
            ViewBag.CategoryParm = searchByCategory;

            int pageIndex = 1;
            pageIndex = page.HasValue ? Convert.ToInt32(page) : 1;
            
            // filter
            IList<Product> products = _productRepository.GetMany(b => b.CompanyId == user.CompanyId).ToList();
            if (!String.IsNullOrEmpty(searchByName))
            {
                products = products.Where(b => b.Name.ToUpper().Contains(searchByName.ToUpper())).ToList();
            }

            if (!String.IsNullOrEmpty(searchByDescription))
            {
                products = products.Where(b => b.Description.ToUpper().Contains(searchByDescription.ToUpper())).ToList();
            }

            if (!string.IsNullOrEmpty(searchByUser))
            {
                products = products.Where(x => x.User.DisplayName == searchByUser).ToList();
            }

            if (!string.IsNullOrEmpty(searchByBrand))
            {
                products = products.Where(x => x.Brand.Name == searchByBrand).ToList();
            }

            if (!string.IsNullOrEmpty(searchByCategory))
            {
                products = products.Where(x => x.Category.Name == searchByCategory).ToList();
            }
            // Sort
            IPagedList<Product> productsToReturn = null;
            switch (sortOrder)
            {
                case "NameDesc":
                    productsToReturn = products.OrderByDescending(b => b.Name).ToPagedList(pageIndex, PageSize);
                    break;
                case "User":
                    productsToReturn = products.OrderBy(b => b.User.DisplayName).ToPagedList(pageIndex, PageSize);
                    break;
                case "UserDesc":
                    productsToReturn = products.OrderByDescending(b => b.User.DisplayName).ToPagedList(pageIndex, PageSize);
                    break;
                case "Description":
                    productsToReturn = products.OrderBy(b => b.Description).ToPagedList(pageIndex, PageSize);
                    break;
                case "DescriptionDesc":
                    productsToReturn = products.OrderByDescending(b => b.Description).ToPagedList(pageIndex, PageSize);
                    break;
                case "Price":
                    productsToReturn = products.OrderBy(b => b.Price).ToPagedList(pageIndex, PageSize);
                    break;
                case "PriceDesc":
                    productsToReturn = products.OrderByDescending(b => b.Price).ToPagedList(pageIndex, PageSize);
                    break;
                case "Brand":
                    productsToReturn = products.OrderBy(b => b.Brand.Name).ToPagedList(pageIndex, PageSize);
                    break;
                case "BrandDesc":
                    productsToReturn = products.OrderByDescending(b => b.Brand.Name).ToPagedList(pageIndex, PageSize);
                    break;
                case "Category":
                    productsToReturn = products.OrderBy(c => c.Category.Name).ToPagedList(pageIndex, PageSize);
                    break;
                case "CategoryDesc":
                    productsToReturn = products.OrderByDescending(c => c.Category.Name).ToPagedList(pageIndex, PageSize);
                    break;
                default:  // Name ascending 
                    productsToReturn = products.OrderBy(b => b.Name).ToPagedList(pageIndex, PageSize);
                    break;
            }

            return View(productsToReturn);
        }

        private void SetCollectionForFilter(User user)
        {
            var users = new List<string>();
            var usersQuery = from d in _userRepository.GetMany(b => b.CompanyId == user.CompanyId)
                             orderby d.DisplayName
                             select d.DisplayName;
            users.AddRange(usersQuery.Distinct());
            ViewBag.SearchByUser = new SelectList(users);

            var brands = new List<string>();
            var brandsQuery = from brand in _brandRepository.GetMany(b => b.CompanyId == user.CompanyId)
                              orderby brand.Name
                              select brand.Name;
            brands.AddRange(brandsQuery.Distinct());
            ViewBag.SearchByBrand = new SelectList(brands);

            var categories = new List<string>();
            var categoriesQuery = from category in _categoryRepository.GetMany(b => b.CompanyId == user.CompanyId)
                                  orderby category.Name
                                  select category.Name;
            categories.AddRange(categoriesQuery.Distinct());
            ViewBag.SearchByCategory = new SelectList(categories);
        }

View-Index

@model IEnumerable<BackOffice.Model.Entities.Product>
@{
    ViewBag.Title = "Products";
}

<h2>Products</h2>
<div id="divProductList">
    @Html.Partial("_ProductList",Model)
</div>

partial view: _ProductsList

@using EFMVC.Web.Core.Extensions
@using PagedList.Mvc
@model PagedList.IPagedList<BackOffice.Model.Entities.Product>
<script type="text/javascript">
    $(document).ready(function () {
        //for table row
        $("tr:even").css("background-color", "#A8A8A8");
        $("tr:odd").css("background-color", "#FFFFFF");

    });
</script>
@{
     var user = HttpContext.Current.User.GetEFMVCUser();
}

<p>
    @Html.ActionLink("Create new product","Create")
</p>
<div>
@using (Html.BeginForm("Index", "Products", FormMethod.Get))
{
    <p>
        <b>Filter by:</b><br/> 
        <b>Name</b> @Html.TextBox("SearchByName", ViewBag.CurrentFilter as string) 
        <b>Description</b> @Html.TextBox("SearchByDescription", ViewBag.DescriptionFilter as string)
        <br/>
        <b>Category</b>
          @Html.DropDownList("SearchByCategory", "All categories")
         <b>Brand</b>
          @Html.DropDownList("SearchByBrand", "All brands")
        @if (user.RoleName == EFMVC.Web.Core.Models.Roles.Admin)
         {   
             <b>User</b>
             @Html.DropDownList("SearchByUser", "All users")
         }
        <input type="submit" value="Search" />
    </p>
} 
</div>
@if(Model.Count>0)
{
        <table>
            <tr>
                 <th style="width:100px">
                     @Html.ActionLink("Name", "Index", new { sortOrder = ViewBag.NameSortParm, 
                                                            currentFilter=ViewBag.CurrentFilter,
                                                            searchByDescription = ViewBag.DescriptionFilter,
                                                            searchByUser=ViewBag.UserParam,
                                                            searchByBrand=ViewBag.BrandParam, 
                                                            searchByCategory = ViewBag.CategoryParam})
                 </th>
                <th style="width:150px">@Html.ActionLink("Description", "Index", new { 
                                                            sortOrder = ViewBag.DescriptionSortParm, 
                                                            currentFilter=ViewBag.CurrentFilter,
                                                            searchByDescription = ViewBag.DescriptionFilter,
                                                            searchByUser=ViewBag.UserParam,
                                                            searchByBrand=ViewBag.BrandParam, 
                                                            searchByCategory = ViewBag.CategoryParam})</th>
                <th style="width:100px">@Html.ActionLink("Category", "Index", new { 
                                                            sortOrder = ViewBag.CategorySortParm, 
                                                            currentFilter=ViewBag.CurrentFilter,
                                                            searchByDescription = ViewBag.DescriptionFilter,
                                                            searchByUser=ViewBag.UserParam,
                                                            searchByBrand=ViewBag.BrandParam, 
                                                            searchByCategory = ViewBag.CategoryParam})</th>
                <th style="width:100px">@Html.ActionLink("Brand", "Index", new { 
                                                            sortOrder = ViewBag.BrandSortParm, 
                                                            currentFilter=ViewBag.CurrentFilter,
                                                            searchByDescription = ViewBag.DescriptionFilter,
                                                            searchByUser=ViewBag.UserParam,
                                                            searchByBrand=ViewBag.BrandParam, 
                                                            searchByCategory = ViewBag.CategoryParam})</th>
                <th style="width:100px">@Html.ActionLink("Price", "Index", new { 
                                                            sortOrder = ViewBag.PriceSortParm, 
                                                            currentFilter=ViewBag.CurrentFilter,
                                                            searchByDescription = ViewBag.DescriptionFilter,
                                                            searchByUser=ViewBag.UserParam,
                                                            searchByBrand=ViewBag.BrandParam, 
                                                            searchByCategory = ViewBag.CategoryParam})</th>
                <th>Link</th>
                <th>Images</th>
                @if (user.RoleName == EFMVC.Web.Core.Models.Roles.Admin)
                {
                     <th style="width:100px">
                     @Html.ActionLink("User", "Index", new { sortOrder = ViewBag.UserSortParm, 
                                                            currentFilter=ViewBag.CurrentFilter,
                                                            searchByDescription = ViewBag.DescriptionFilter,
                                                            searchByUser=ViewBag.UserParam,
                                                            searchByBrand=ViewBag.BrandParam, 
                                                            searchByCategory = ViewBag.CategoryParam})
                 </th>
                }
                <th style="width:120px"></th>
            </tr>
            @foreach (var item in Model)
            {
                <tr>
                    <td>
                        @item.Name
                    </td>
                    <td>
                        @item.ShortDescription
                    </td> 
                    <td>
                      <a href="@Url.Content("/Categories/Details/" + @item.Category.Id)" target="_blank">@item.Category.Name</a>
                    </td> 
                    <td>
                      <a href="@Url.Content("/Brands/Details/" + @item.Brand.Id)" target="_blank">@item.Brand.Name</a>
                    </td> 
                    <td>
                        @item.PriceToString
                    </td>  
                    <td>
                       <a href="@item.Link" target="_blank">link</a> 
                    </td>  
                    <td>
                        <img width="100" src='@Url.Action("getimage/" + @item.Id+"/0", "Products")' />
                        <img width="100" src='@Url.Action("getimage/" + @item.Id+"/1", "Products")' />
                        <img width="100" src='@Url.Action("getimage/" + @item.Id+"/2", "Products")' />
                    </td>
                     @if (user.RoleName == EFMVC.Web.Core.Models.Roles.Admin)
                     {
                     <td>@item.User.DisplayName</td>
                     }
                    <td>
                        @Html.ActionLink("Edit", "Edit", new {id = item.Id})
                        @Html.ActionLink("Details", "Details", new {id = item.Id})
                        @Ajax.ActionLink("Delete", "Delete", new {id = item.Id},
                            new AjaxOptions
                            {
                                Confirm = "Would you like to delete the selected product?", HttpMethod = "Post",
                                UpdateTargetId = "divProductList"
                            })  
                    </td>
                </tr>
            }
        </table>

        <br />
        <div id='Paging' style="text-align: center">
            Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber)
            of @Model.PageCount

            @Html.PagedListPager(Model, page => Url.Action("Index", new {page, 
                                                               sortOrder = ViewBag.CurrentSort, 
                                                               currentFilter = ViewBag.CurrentFilter,
                                                               searchByDescription = ViewBag.DescriptionFilter,
                                                               searchByUser=ViewBag.UserParam,
                                                               searchByBrand=ViewBag.BrandParam, 
                                                               searchByCategory = ViewBag.CategoryParam}))
        </div>
    }
else
{
    if (string.IsNullOrEmpty(ViewBag.CurrentFilter) && 
        string.IsNullOrEmpty(ViewBag.BrandParam) &&
        string.IsNullOrEmpty(ViewBag.CategoryParam &&
        string.IsNullOrEmpty(ViewBag.DescriptionFilter)))
    {
         <p>There aren´t any product created.</p>
    }
    else
    {
        <p>There aren´t any product for the selected search.</p>
    }
}

نتیجه:

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

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

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

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