【问题标题】:ASP.NET MVC Query HelpASP.NET MVC 查询帮助
【发布时间】:2011-01-05 16:25:42
【问题描述】:

我的应用上有以下 Index 方法,它显示了一堆文章:

public ActionResult Index(String query)
{
    var ArticleQuery = from m in _db.ArticleSet select m;

    if (!string.IsNullOrEmpty(query))
    {
        ArticleQuery = ArticleQuery.Where(m => m.headline.Contains(query));
    }

    //ArticleQuery = ArticleQuery.OrderBy(m.posted descending);

    return View(ArticleQuery.ToList());
}

它还可以通过抓取查询字符串(如果存在)来兼作搜索机制。

问题 1.) OrderBy 不起作用,我需要对其进行什么更改才能使其按发布日期降序显示结果。

问题 2.) 我将添加一个非常简单的分页,因此每页只想显示 4 个结果。我最好怎么做?谢谢

编辑:除了问题 2,我正在寻找一个简单的 Helper 类解决方案来将所述分页实现到我当前的代码中。这个看起来很好(http://weblogs.asp.net/andrewrea/archive/2008/07/01/asp-net-mvc-quot-pager-quot-html-helper.aspx),但我将如何实现它进入我的应用程序。谢谢。

【问题讨论】:

    标签: asp.net-mvc linq pagination


    【解决方案1】:
    1. ArticleQuery.OrderByDescending(m => m.posted)
    2. 查看MvcContrib,其中包含一个 分页助手,可以是 used on it's own,或与 MvcContrib 的 Grid helper 结合使用

    编辑:使用 MvcContrib 并不容易

    1/ 创建您的可查询源

    public ActionResult Index(String query, int? page)
    {
    var pagesize = 4; // can also be a parameter and/or a configuration setting
    var ArticleQuery = from m in _db.ArticleSet select m;
    
    if (!string.IsNullOrEmpty(query))
    {
        ArticleQuery = ArticleQuery.Where(m => m.headline.Contains(query));
    }
    
    ArticleQuery = ArticleQuery.OrderByDescending(m => m.posted);
    
    return View(ArticleQuery.AsPagination(page, pageSize));
    }
    

    2/ 在您看来,您可以像这样使用 MvcContrib 寻呼机辅助方法:

     <%= Html.Pager((IPagination)Model)%>
    

    这将输出一个漂亮的寻呼机控件。

    这里还有一个解释,同样使用了MvcContrib网格控件(非必须):http://davidhayden.com/blog/dave/archive/2009/06/25/mvccontribgridpagerhelpers.aspx

    【讨论】:

    • 希望实现我自己的非常简单的一个。我需要做的就是在一个页面上显示 4 个结果,并在底部显示一些链接,例如下一页和上一页。
    【解决方案2】:

    您需要进行如下重组(假设第 0 页是第一页):

    public ActionResult Index(String query, int page)
    {
        var ArticleQuery = (from m in _db.ArticleSet select m);
    
        if (!string.IsNullOrEmpty(query))
        {
            ArticleQuery = ArticleQuery.Where(m => m.headline.Contains(query));
        }
    
        ArticleQuery = ArticleQuery.Skip(page*4).Take(4).OrderByDescending(m => m.posted);
    
        return View(ArticleQuery.ToList());
    }
    

    那里有很多分页解决方案,我不推荐任何一种。上面的代码演示了一个将分页的后端实现,您仍然必须提供分页器等。

    【讨论】:

    • @Cameron :我建议使用其他一些答案中建议的工具。 MVCContrib 将是一个好的开始。
    【解决方案3】:
    1. (和 .2 的一部分)

      返回视图(ArticleQuery.OrderByDecending(a => a.posted).Take(4).ToList());

    2. 改变你的行动(这只是让你开始,不是最好的答案)

    一个

    public ActionResult Index(string query, int page)
    {
        var ArticleQuery = from m in _db.ArticleSet select m;
        if (!string.IsNullOrEmpty(query))
        {
            ArticleQuery = ArticleQuery.Where(m => m.headline.Contains(query));
        }
        return View(ArticleQuery.OrderByDecending(a => a.posted).Skip(page * 4).Take(4).ToList());
    }
    

    【讨论】:

      【解决方案4】:

      问题 #1:OrderBy(和 OrderByDescending,我认为这是您想要的)方法要求您传递一个函数来指定如何执行排序。大多数人选择使用 lambda 表达式来执行此操作:

      ArticleQuery = ArticleQuery.OrderByDescending(m => m.posted);
      

      更多详情请见the MSDN page

      问题 #2:您需要更改操作方法以接受页码和页面大小参数,然后从您的视图中传递这些参数。在您的 LINQ 查询中,您将使用我喜欢称之为“Skip + Take”的方法:

      public ActionResult Index(String query, int pageNumber, int pageSize) 
      {
          ...
          ArticleQuery = ArticleQuery.OrderByDescending(m => m.posted).Skip(pageNumber * pageSize).Take(pageSize);
          ...
      }
      

      【讨论】:

      • 该代码只是抛出错误:参数字典包含方法 'System.Web.Mvc.ActionResult Index(System.字符串,Int32,Int32)'
      【解决方案5】:

      您可以将orderby添加到您的原始查询中,前4名可以使用.Take([number])完成

      public ActionResult Index(String query) 
      {
           var ArticleQuery = from m in _db.ArticleSet orderby posted descending select m; 
           if (!string.IsNullOrEmpty(query))           
           {
                 ArticleQuery = ArticleQuery.Where(m => m.headline.Contains(query));
           }       
           return View(ArticleQuery.Take(4).ToList());
      } 
      

      【讨论】:

        【解决方案6】:

        我是从头顶回答这个问题,所以请检查这个答案是否正确。

        问题 1.) 这不起作用,因为您将 IOrderedEnumerable 分配给 IEnumerable。 ArticleQuery 类型应为 IEnumerable。

        您应该将“var ArticleQuery”更改为“IOrderedEnumerable ArticleQuery”。这应该有效。 如果不是这种情况,因为无论如何您要在之后将其转换为 List,只需在订购之前放置 ToList() 并使用单独的 List 对象。

        问题 2.) 你需要这样的东西(未经测试):

        int PageSize = 4;
        public ActionResult Index(String query, int page)
        {
            IOrderedEnumerable ArticleQuery = (from m in _db.ArticleSet select m);
        
            if (!string.IsNullOrEmpty(query))
            {
                ArticleQuery = ArticleQuery.Where(m => m.headline.Contains(query));
            }
        
            ArticleQuery = ArticleQuery.Skip(PageSize * (page - 1)).Take(PageSize).OrderBy(m.posted descending);
        
            return View(ArticleQuery.ToList());
        }
        

        对于问题2的补充,我不知道你的意思是什么,请详细解释一下。但总的来说,我认为您不需要 Helper 类来解决分页问题。

        【讨论】:

          【解决方案7】:

          卡梅隆,

          我希望通过下载链接的示例在这种情况下对您有所帮助。我为 SO 上的其他人制作了这个小应用程序,以帮助解决类似的问题。基本上,它展示了如何创建 IPagedList 接口。

          public interface IPagedList
          {
              int PageIndex { get; set; }
              int PageSize { get; set; }
              int TotalPages { get; set; }
          }
          

          然后您创建一个具体的类并通过您的查询字符串参数(包括 OrderBy 等)填充它。

          类似这样的:

          public class Test 
          {
              public string FirstName { get; set; }
              public string LastName { get; set; }
              public int SerialNumber { get; set; }
          }
          public class TestCollection : IPagedList
          {
              public IList<Test> TestList { get; set; }
          
              // purely for test purposes
              public int PageIndex{ get; set; }
              public int PageSize { get; set; }
              public int TotalPages{ get; set; }
          
              public TestCollection()
              {
                  TestList = new List<Test>();
              }
          }
          

          它看起来是这样的:

          您可以在这里获取它:

          http://gatehousemusic.com/downloads/MvcApplication2.zip

          玩得开心..

          【讨论】:

          • 如果您要使用图像中的简单行进行分页,“分页”的一个非常好的答案是使用 jQuery 和 DataTables 插件。结果看起来/感觉分页,但所有结果都可用于在排序更改时重新分页。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-31
          • 2011-08-17
          • 2014-06-04
          • 2010-10-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多