MVC天冬氨酸项目排序 [英] Mvc Asp Sorting items

查看:151
本文介绍了MVC天冬氨酸项目排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的应用程序中使用PagedList.MVC进行分页。这是工作的罚款。分页工作正常,也是排序依据的DropDownList工作正常。当我从DropDownList中选择值它给人的期望排序的结果。我的意思是,如果我选择A-Z然后按升序排序罚款的项目,但是当我点击第二页或下一页它不排序任何项目及网址变成了这个样子

的http://本地主机:41213 /首页/产品页= 2及的pageSize = 6

和还我怎样才能让这个的pageSize = 6动态?我想这把像DropDownList的{} 5,10,15,20,当用户选择一个值,那么它应该显示项目的选定号码。

控制器

  [HTTPGET]
    公众的ActionResult产品(INT?排序依据,诠释页= 1,中间体的pageSize = 6)
    {
        私人购物DB =新购物();
        开关(排序依据)
        {
            情况1:
                清单<产品与GT; listProductsasc = db.Products.OrderBy(p值=> p.Name).ToList();
                PagedList<产品与GT; modelasc =新PagedList<产品及GT;(listProductsasc,页面的pageSize);
                返回查看(modelasc);
            案例2:
                清单<产品与GT; listProductsdesc = db.Products.OrderByDescending(p值=> p.Name).ToList();
                PagedList<产品与GT; modeldesc =新PagedList<产品及GT;(listProductsdesc,页面的pageSize);
                返回查看(modeldesc);
            默认:
                清单<产品与GT; listProducts = db.Products.ToList();
                PagedList<产品与GT; modeldefault =新PagedList<产品及GT;(listProducts,页面的pageSize);
                返回查看(modeldefault);
        }
    }

查看

  @model PagedList.IPagedList< FypStore.Models.Product>
@using PagedList.Mvc
< D​​IV CLASS =行>
        < D​​IV CLASS =COL-SM-6>
            @using(Html.BeginForm(产品,家,FormMethod.Get,新{ID =Form1的}))
            {
                < D​​IV CLASS =COL-SM-8>
                    排序方式:
                    @ Html.DropDownList(排序依据,新的List< SelectListItem>                     {
                        新SelectListItem的{text =A-Z值=1},
                        新SelectListItem的{text =Z-A,值=2}
                     } - 订购 - )                < / DIV>
                < D​​IV CLASS =COL-SM-4>
                    < D​​IV CLASS =表单组>
                        < D​​IV CLASS =COL-MD-偏移2 COL-MD-10>
                            <输入类型=提交级=BTN BTN-默认值=过滤器/>
                        < / DIV>
                    < / DIV>
                < / DIV>
            }
        < / DIV>
< / DIV>
< BR />@ Html.PagedListPager(型号,页= GT; Url.Action(产品,新的{页的pageSize = Model.PageSize}))
显示@ Model.FirstItemOnPage为@ Model.LastItemOnPage @ Model.TotalItemCount产品


解决方案

您需要修改 PagedListPager()方法的路由参数,包括排序的山谷顺序,例如:

  @ Html.PagedListPager(型号,页= GT; Url.Action(产品,新的{排序依据= ViewBag.SortOrder,页面的pageSize = Model.PageSize}))

和随后在该方法中,包括

  ViewBag.SortOrder =排序依据;

返回视图前。但更好的方法是使用含有由视图中使用的属性,这将解决您的code等问题视图模型(例如,如果您选择了ZA选项,并提交表单,当你回吧,集合排序,但下拉列表显示 - 订购 - 说明其没有排序查看模型应

 公共类ProductsVM
{
  [显示(NAME =排序)]
  公众诠释?排序依据{搞定;组; }
  公共IEnumerable的< SelectListItem> OrderList {搞定;组; }
  公众诠释页{搞定;组; }
  公众诠释每页{搞定;组; }
  PagedList<产品与GT;产品{搞定;组; }
}

和控制器的方法是

  [HTTPGET]
公众的ActionResult产品(INT?排序依据,诠释页= 1,中间体的pageSize = 6)
{
  私人购物DB =新购物();
  IEnumerable的<产品与GT;产品= db.Products; //不.ToList()
  如果(ORDERBY == 1)
  {
    产品= products.OrderBy(P => p.Name);
  }
  否则如果(ORDERBY == 2)
  {
    产品= products.OrderByDescending(P => p.Name)
  }  ProductsVM模式=新ProductsVM
  {
    排序依据=排序依据,
    OrderList =新的List< SelectListItem>
    {
      新SelectListItem的{text =A-Z值=1},
      新SelectListItem的{text =Z-A,值=2}
    },
    页=页
    每页= pageSize的,
    产品=新PagedList<产品及GT;(产品,页面的pageSize);
  };
  返回查看(模型);
}

和最后修改您查看使用视图模型

  @model ProductsVM
....
@using(Html.BeginForm(产品,家,FormMethod.Get))
{
  @ Html.LabelFor(M = GT; m.OrderBy)
  @ Html.DropDownListForFor(M = GT; m.OrderBy,Model.OrderList - 订购 - )
  <输入类型=提交级=BTN BTN-默认值=过滤器/>
}@ Html.PagedListPager(Model.Products,页=> Url.Action(产品,新的{ORDERBY = Model.OrderBy,页面的pageSize = Model.PageSize}))
显示@ Model.Products.FirstItemOnPage为@ Model.Products.LastItemOnPage @ Model.Products.TotalItemCount产品

I've used PagedList.MVC for pagination in my application. This is working fine. Pagination is working fine and also the OrderBy dropdownlist is working fine. When i select value from dropdownlist it gives the desired sorted result. I mean if i select A-Z then it sorts the items fine in ascending order but when i click 2nd page or next page it doesn't sort any item and the url is become like this

http://localhost:41213/Home/Products?page=2&pageSize=6

And also how can I make this pageSize=6 a dynamic ? I want this to put in dropdownlist like {5,10,15,20} and when user selects a value then it should display that selected numbers of item.

Controller

    [HttpGet]
    public ActionResult Products(int? OrderBy, int page=1, int pageSize=6)
    {
        private Shopping db = new Shopping();
        switch (OrderBy)
        {
            case 1:
                List<Product> listProductsasc = db.Products.OrderBy(p => p.Name).ToList();
                PagedList<Product> modelasc = new PagedList<Product>(listProductsasc, page, pageSize);
                return View(modelasc);
            case 2:
                List<Product> listProductsdesc = db.Products.OrderByDescending(p => p.Name).ToList();
                PagedList<Product> modeldesc = new PagedList<Product>(listProductsdesc, page, pageSize);
                return View(modeldesc);
            default:
                List<Product> listProducts = db.Products.ToList();
                PagedList<Product> modeldefault = new PagedList<Product>(listProducts, page, pageSize);
                return View(modeldefault);
        }
    }

View

@model PagedList.IPagedList<FypStore.Models.Product>
@using PagedList.Mvc
<div class="row">
        <div class="col-sm-6">
            @using (Html.BeginForm("Products", "Home", FormMethod.Get, new { id = "Form1" }))
            {
                <div class="col-sm-8">
                    Sort by:
                    @Html.DropDownList("OrderBy", new List<SelectListItem>

                     {
                        new SelectListItem{ Text="A-Z", Value = "1" },
                        new SelectListItem{ Text="Z-A", Value = "2" }
                     }, "-- Order By --")

                </div>
                <div class="col-sm-4">
                    <div class="form-group">
                        <div class="col-md-offset-2 col-md-10">
                            <input type="submit" class="btn btn-default" value="Filter" />
                        </div>
                    </div>
                </div>
            }
        </div>
</div>
<br />

@Html.PagedListPager(Model, page => Url.Action("Products", new { page, pageSize = Model.PageSize }))
Showing @Model.FirstItemOnPage to @Model.LastItemOnPage of @Model.TotalItemCount Products

解决方案

You need to modify the route parameters of the PagedListPager() method to include the vale of the sort order, for example

@Html.PagedListPager(Model, page => Url.Action("Products", new { OrderBy = ViewBag.SortOrder, page, pageSize = Model.PageSize }))

and then in the method, include

ViewBag.SortOrder = OrderBy;

before you return the view. However a better approach is to use a view model containing the properties used by the view which will resolve other issues with your code (for example, if you select the "Z-A" option and submit the form, when you return it, the collection is sorted, but dropdown displays "-- Order By --" indicating its not sorted. You view model should be

public class ProductsVM
{
  [Display(Name = "Sort by:")]
  public int? OrderBy { get; set; }
  public IEnumerable<SelectListItem> OrderList { get; set; }
  public int Page { get; set; }
  public int PageSize { get; set; }
  PagedList<Product> Products { get; set; }
}

and the controller method would be

[HttpGet]
public ActionResult Products(int? orderBy, int page=1, int pageSize=6)
{
  private Shopping db = new Shopping();
  IEnumerable<Product> products = db.Products; // not .ToList()
  if (orderBy == 1)
  {
    products = products.OrderBy(p => p.Name);
  }
  else if (orderBy == 2)
  {
    products = products.OrderByDescending(p => p.Name)
  }

  ProductsVM model = new ProductsVM
  {
    OrderBy = orderBy,
    OrderList = new List<SelectListItem>
    {
      new SelectListItem{ Text="A-Z", Value = "1" },
      new SelectListItem{ Text="Z-A", Value = "2" }
    },
    Page = page,
    PageSize = pageSize,
    Products = new PagedList<Product>(products, page, pageSize);
  };
  return View(model);
}

And finally modify you view to use the view model

@model ProductsVM
....
@using (Html.BeginForm("Products", "Home", FormMethod.Get))
{
  @Html.LabelFor(m => m.OrderBy)
  @Html.DropDownListForFor(m => m.OrderBy, Model.OrderList, "-- Order By --")
  <input type="submit" class="btn btn-default" value="Filter" />
}

@Html.PagedListPager(Model.Products, page => Url.Action("Products", new { orderBy = Model.OrderBy, page, pageSize = Model.PageSize }))
Showing @Model.Products.FirstItemOnPage to @Model.Products.LastItemOnPage of @Model.Products.TotalItemCount Products

这篇关于MVC天冬氨酸项目排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆