留言簿

我要留言
留言搜索

2013-01-14 19:21  bruce

杨老师,我还是 bruce 哈。我的代码如下:



[HttpGet]
public ActionResult Index(int? id)
{
    int pageIndex = id.HasValue && id.Value > 1 ? id.Value : 1;
    int pageSize = 10;

    SearchProduct searchEntity = GetSearchProduct(); // 从路由或 QueryString 里面得到搜索条件并封装到实体中
    int recordCount;
    IList<Product> data = _productRepository.GetEntitiesByPager(pageIndex, pageSize, searchEntity, new[] { Product_OrderByItem.Name_DESC }, out recordCount);

    var modelResult = new PagedList<Product>(data, pageIndex, pageSize, recordCount);

    ViewBag.searchEntity = searchEntity;
    return View(modelResult);
}


当用户搜索时, recordCount 可能会很大,比如 1w 条记录满足搜索条件,而方法 _productRepository.GetEntitiesByPager 每次返回只有 pageSize(即 10 )条数据,所以我只能用 new 

PagedList<Product> 的第二个参数。所以正如 2 次和您交流的,当用户手动输入一个特别大的 pageIndex 时,方法 _productRepository.GetEntitiesByPager 查询到的数量为 0,而 recordCount 还

是 1w,这个 recordCount 其实是满足搜索条件的记录数,只不过用户手动输入的 pageIndex 过大而已,不知道我说的对不对,您自己也可以写一个小的 Demo 来测试哈,谢谢老师的聆听!
回复:您好,我今天看了下更新说明,这个问题在我使用的测试版上已经解决了,说明是这样的:“ToPagedList扩展方法添加功能:当前页索引超出总页数时改变当前页索引为最后一页的页索引,同时获取最后一页的数据;”,最近忙其它项目,MvcPager升级断断续续,还有很多功能没添加,现在只完成了Ajax分页模式下浏览器历史记录支持等几个功能,所以暂时发布不了,可能得过年后,谢谢支持!

2013-01-13 21:19  hambert

你好,请问Html.AjaxPager能在网页上传递自定义的参数回控制器吗
回复:您好,您可以将参数通过url来传递。谢谢!

2013-01-11 16:25  tiaru

杨老师,您好。
MvcPager使用中,怎么让Div生成包含ul?
回复:您好,不知道您说的是不是PagerOptions中的ContainerTagName这个属性?请参考一下帮助文档。谢谢!

2013-01-11 10:53  孙咪咪

你好,看到你是一个比较专业的技术人员,非常感谢你攻击了我的网站,求加好友QQ243151826
回复:您好,我只是比较专业点的网站开发人员而已,从没有共和制过任何人的网站,不明白您说我共和制您的网站是何用意?谢谢!

2013-01-10 13:05  tiaru

MvcPager,您的示例中PageIndexParameterName="id",我用的是pageIndex,除此之外,我还传入了一个pageSize,Action代码如下:
public virtual PartialViewResult ListPartial(int? pageIndex,int? pageSize)
{
 int page = pageIndex ?? 1;
 int size = pageIndex ?? 15;
}
额,错误出来了,我直接把pageIndex给了size。刚刚改过来之后正常了。
那就问另一个问题,不能动态改变size大小吗,不过这个意义不大就是了。
回复:您好,完全可以,这和MvcPager没有任何关系,您把它传到PagedList构造函数中就可以了。谢谢!

2013-01-10 09:56  bruce

杨老师,我还是昨天 2013/1/9 16:51:38 给你留言的 bruce。

昨天我可能没有说清楚,比如下面的代码:


int pageIndex = 9; // 页码,由用户输入
int pageSize = 10;
int recordCount;
IList<Product> data = _productRepositry.GetEntitiesBySearch(pageIndex, pageSize, out recordCount);
var modelResult = new PagedList<Product>(data, pageIndex, pageSize, recordCount);

当查询出来的 recordCount=55,而 data 的 Count = 0 时,View 层分页时就会报错:页索引超出范围,就像下面的代码一样:

var modelResult = new PagedList<Product>(new List<Product>(), 9, 10, 55);

我觉得分页是不是应该以 PagedList<T> 的构造函数的第一个参数为准呢?如果第一个参数的 Count = 0,就不显示分页条,即使后面的 3 个参数都符合条件。



我修改了您的源代码,在 PagedList<T> 的 4 个参数的构造函数中加了一个 if 判断,当 !items.Any() 成立时,把 totalItemCount 赋予 0 就 OK 了。下面是我修改后的代码:



public PagedList(IEnumerable<T> items, int pageIndex, int pageSize, int totalItemCount)
{
    if (items == null)
    {
        throw new ArgumentNullException("items");
    }
    // 下面这个是判断集合中是否有元素,没有则把 totalItemCount 设置为 0,避免出现错误:索引超出范围
    if (!items.Any())
    {
        totalItemCount = 0;
    }
    AddRange(items);
    TotalItemCount = totalItemCount;
    CurrentPageIndex = pageIndex;
    PageSize = pageSize;
}
回复:您好,您对这个构造函数的理解有些错误,在您的例子中,正确的应该是用这个构造函数:public PagedList(IList items,int pageIndex,int pageSize),其中items是要分页的全部数据,四个参数的构造函数最后一个参数和第一个参数没有关联,当前页数据为空不应该等于总记录都为0,所以您这样修改还是会有问题的,不知道您是否有引发这种错误的实例可以看一下?我根据具体的情况再看如何完善更好。谢谢!

2013-01-10 00:11  tiaru

杨老师,问题找出来了,
除了pageindex之外,我另外定义了一个可空的pagesize,在另一个项目里这样可以,但是刚刚出错了错误改过来之后就正常了。
请问这是怎么回事?
回复:您好,很抱歉,我没看懂您的问题,不知道您说的是哪个控件,可空的pagesize是什么意思?什么情况下出错?出现什么错误?谢谢!

2013-01-09 23:35  tiaru

杨老师,Area的问题已经解决了。
现在使用MVCPager,Ajax过程中出现一个问题,总条数16,每页15条,第一页正常,点击第二页条目正常,分页列表显示为1~8页,再跳页的话就显示若干条记录不定,请问这种情况是我在哪里写错?
回复:您好,这是您获取分页数据时获取的数据不正确导致的问题,请调试检查。谢谢!

2013-01-09 20:55  朱学富

杨老师,您好:
我是高校的在校的学生,现在正在用ASP.NET来给老师做一个网站,开发时需要使用MVC框架,MODEL的地方现在已经设计的基本可以了,就是前台Web的设计不知道该采取哪种方法,传统的CSS+DIV,WebForm和MVC的结合,还是采用第三方控件。
希望杨老师能给一些建议和理由,谢谢。
回复:您好,您说的四种方法其实只是两种,也就是WebForm和MVC,第一种和最后一种与这两种方法没有任何冲突。选WebForm还是Mvc,取决于您对开发速度的要求及对html等技术的熟悉程度。WebForm开发速度相对较快,对html等熟悉程度的要求也不是很高,但需要大量使用控件,细节不好控制,运行效率相对较低,而MVC可以控制最终生成的html的任何细节,但这就需要您非常熟悉html、javascript以及css等这些技术,而且Mvc不象WebForm有很多控件,包括前台很多代码都需要手工输入或用工具自动生成后进行修改,开发速度相对WebForm比较慢。我之所以从刚推出就选择MVC就是因为上面说的可以精确控制前台任何代码,不喜欢WebForm中控件自动生成的很多垃圾代码以及ViewState等等,不过WebForm经升级换代,现在很多地方也可以精确控制了,包括ViewState等等,但我还是更喜欢MVC的简捷和直接!谢谢!

2013-01-09 17:18  sneko

请教下老师,怎么样实现post分页呢?
回复:您好,不知道您说的是哪个控件?如果是AspNetPager,默认就是Postback回发分页方式,如果是MvcPager,只有Ajax分页时才支持Post分页,设置AjaxOptions.HttpMethod为Post即可。谢谢!
;