2014-11-05 55 views
1

排序和分页如何工作?排序和分页MVC

作为前言,我对这些材料很感兴趣。所以,外行的条件是值得赞赏的。

我跟着turorials,张贴在这里,并有我的一般工作。我只是困惑,因为当我排序我的列时,排序列表不会继续到下一页。然后,当我点击标题进行排序时,在下一页上说AppName,它会将我带回第一页。

我该如何避免这样做?表后

public ActionResult Index(string sortOrder, string searchString, int? page) 
    { 
     ViewBag.CurrentSort = sortOrder; 
     ViewBag.IDSortParm = String.IsNullOrEmpty(sortOrder) ? "AppID_desc" : ""; 
     ViewBag.NameSortParm = sortOrder == "Name" ? "AppName_desc" : "Name"; 
     ViewBag.TechSortParm = sortOrder == "Tech" ? "Technology_desc" : "Tech"; 
     ViewBag.VersSortParm = sortOrder == "Vers" ? "Version_desc" : "Vers"; 
     ViewBag.TierSortParm = sortOrder == "Tier" ? "Tier_desc" : "Tier"; 
     ViewBag.StratSortParm = sortOrder == "Strat" ? "Strategy_desc" : "Strat"; 

     if (Request.HttpMethod != "GET") 
     { 
      page = 1; 
     } 


     ViewBag.CurrentFilter = searchString; 


     var applications = from a in db.Application_ 
       select a; 

     if (!String.IsNullOrEmpty(searchString)) 
     { 
      applications = applications.Where(a => a.AppName.ToUpper().Contains(searchString.ToUpper())); 

     } 

     switch (sortOrder) 
     { 
       case "AppID_desc": 
       applications = applications.OrderByDescending(a => a.AppID); 
       break; 
       case "Name": 
       applications = applications.OrderBy(a => a.AppName); 
       break; 
       case "AppName_desc": 
       applications = applications.OrderByDescending(a => a.AppName); 
       break; 
       case "Vers": 
       applications = applications.OrderBy(a => a.Version); 
       break; 
       case "Version_desc": 
       applications = applications.OrderByDescending(a => a.Version); 
       break; 
       case "Tier": 
       applications = applications.OrderBy(a => a.Tier); 
       break; 
       case "Tier_desc": 
       applications = applications.OrderByDescending(a => a.Tier); 
       break; 
       case "Strat": 
       applications = applications.OrderBy(a => a.Strategy); 
       break; 
       case "Strat_desc": 
       applications = applications.OrderByDescending(a => a.Strategy); 
       break; 
       default: 
       applications = applications.OrderBy(a => a.AppID); 
       break; 

       } 
     int pageSize = 20; 
     int pageNumber = (page ?? 1); 
     return View(applications.ToPagedList(pageNumber, pageSize)); 
    } 

指数:

<div> 
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) 
of @Model.PageCount 

@if (Model.HasPreviousPage) 
{ 
    @Html.ActionLink("<<", "Index", new { page = 1 }) 
    @Html.Raw(" "); 
    @Html.ActionLink("< Prev", "Index", new { page = Model.PageNumber - 1 }) 
} 
else 
{ 
    @:<< 
    @Html.Raw(" "); 
    @:< Prev 
    } 

@if (Model.HasNextPage) 
{ 
    @Html.ActionLink("Next >", "Index", new { page = Model.PageNumber + 1 }) 
    @Html.Raw(" "); 
    @Html.ActionLink(">>", "Index", new { page = Model.PageCount }) 
} 
else 
{ 
    @:Next < 
    @Html.Raw(" "); 
    @:>> 

} 

如果任何人有任何的信息对我来说,还是可以点我在这将是惊人的正确方向。 谢谢!

回答

3

您必须随身携带任何查询参数。对于页面的链接,例如,你需要建立链接时,包括排序查询参数:

@Html.ActionLink("Next >", "Index", new { page = Model.PageNumber + 1, sortOrder = Request["sortOrder"] }) 

这同样反向您的排序。如果您想继续页码,则需要在构建链接时包含页码。但是,应该注意的是,在更改排序时转到第1页是相当典型的,因为页码的上下文已经改变。

+0

这是非常合情合理的。好,非常感谢你的帮助!我现在工作得很好。 – momofierce 2014-11-05 19:53:15

+0

或只是一个隐藏的输入来保存该值,这是常见的做法,这种方式剃须刀来回传递数据,而不必记住链接中的每个参数 – 2014-11-05 20:49:39

+0

这需要使链接变为一种形式,并使用POST而不是GET ,这是不合适的。 – 2014-11-05 22:15:33

2

你需要在你的行动排序顺序ViewBag.CurrentSort链接 喜欢的东西:

@Html.ActionLink("Next >", "Index", new { page = Model.PageNumber + 1 }, sortOrder = ViewBag.CurrentSort)