1

我想用实体数据模型在 MVC 4 中创建一个分页。我的Home/NameDetailsPage工作正常,一次返回所有行。但我想用分页显示这些数据,因为有这么多行。所以我试过这样

 public ActionResult NameDetailsPage(int page)
    {

        var context = new BlogContext();
        IQueryable<string> list;
        list = from m in context.Blogs.OrderBy(m => m.BlogId)
               select m.Name;

         ViewBag.total=list.ToArray().Length;

        return View("NameDetails", list.Skip(page * 4).Take(4));
    }

这里的页码表示我想跳过 page*4 行来获取接下来的 4 行。不幸的是,我发现了这些错误。

The parameters dictionary contains a null entry for parameter 'page' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult NameDetailsPage(Int32)' in 'webpro.Controllers.HomeController'.
An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
Parameter name: parameters

我应该怎么办 ?提前致谢。

4

2 回答 2

3

错误给了你答案;page是一个非可选参数。换句话说,路由引擎找不到合适的无参数操作方法,或具有可选参数的操作方法。

您需要设置page为可选参数

public ActionResult NameDetailsPage(int page = 1)
{
...

或者通过路由定义传递默认值。

于 2013-09-15T21:44:44.950 回答
1

根据错误,使参数 Nullable 满足预期的条件。这在下面的方法 NameDetailsPage() 的开头进行了演示。

另一个关于 LINQ to Entities 的建议(未询问但也提供)是避免将整个集合拉到本地,请参阅下面的 .Count() 使用。

代码组织方面,我将分页位放在顶部的原因是,如果出现问题,即客户端请求页面 -1(添加验证),则会在访问数据存储之前进行处理。

我还更改了 LINQ 查询本身以专门使用扩展方法。这可以通过更改 LINQ 查询以专门使用集成查询语法来完成。关键是尽可能多地使用其中之一。不得不考虑这两种语法对代码的维护者来说是不必要的困难。

public ActionResult NameDetailsPage(int? page)
{
    // TODO: add validation of parameters
    // TODO: REVIEW page size as a hard-coded constant will likely become a user-input
    const int pageSize = 4;
    var pageNumberRequested = page ?? 1; //<< assuming page is 1-based, a person would say "page 1"
    var skipRecords = (pageNumberRequested - 1) * pageSize;
    var takeRecords = pageSize;

    var context = new BlogContext();
    var blogEntries = context.Blogs.OrderBy(blog => blog.BlogId)
                          .Select(blog => blog.Name);

    var totalCount = blogEntries.Count(); //<< let the server-side use an index rather than shipping all of the records, which is a huge amount of Net I/O, then using a huge amount of RAM to create an array, only to get the number of elements in the array.

    var pageOfBlogEntries = blogEntries.Skip(skipRecords).Take(takeRecords);

    ViewBag.total = totalCount;

    return View("NameDetails", pageOfBlogEntries);
}
于 2013-09-15T21:44:19.933 回答