我的应用上有以下索引方法,显示了一堆文章:
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),但我将如何实施它进入我的应用程序。感谢。答案 0 :(得分:2)
编辑:使用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
答案 1 :(得分:1)
您需要重新构建如下(假设第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());
}
那里有很多分页解决方案,而不是我推荐的任何其他解决方案。上面的代码演示了一个将要分页的后端实现,你仍然需要提供寻呼机等。
答案 2 :(得分:0)
卡梅伦
我希望通过下载链接的示例可以帮助您解决此问题。我为SO上的其他人制作了这个小应用程序以帮助解决类似的问题。基本上,它显示了如何创建IPagedList接口。
即
public interface IPagedList
{
int PageIndex { get; set; }
int PageSize { get; set; }
int TotalPages { get; set; }
}
然后创建一个具体类,并通过查询字符串params(包括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
玩得开心..
答案 3 :(得分:0)
问题#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);
...
}
答案 4 :(得分:0)
您可以将orderby添加到原始查询中,可以使用.Take([number])
完成前4项。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());
}
答案 5 :(得分:0)
(和.2的一部分)
返回视图(ArticleQuery.OrderByDecending(a =&gt; a.posted).Take(4)。ToList());
改变你的行动(这只是让你开始,而不是最好的答案)
一
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());
}
答案 6 :(得分:0)
我正在从头顶回答这个问题,所以请检查这个答案是否正确。
问题1.)这不起作用,因为您正在为IEnumerable分配IOrderedEnumerable。 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的补充,我不知道你的意思,请详细解释。但总的来说,我不认为你需要一个帮助类来进行分页解决方案。