求助!使用MVC开发,想要分页,出现问题

_Joker_ 2017-03-10 02:19:33
使用MVC开发网站,想要实现分页,却出现如下问题。
"System.Web.Mvc.HtmlHelper<dynamic>"没有名为"Pager"的适当方法,但似乎有一个该名称的扩展方法.扩展方法不能进行动态调度.请考虑强制转换动态参数,或调用不含扩展方法语法的扩展方法.

(公司的网络不好,不能传图。)
这个方法我是从一个下载但本地的例子看到的,这个例子运行成功。
例子里面的页面是使用的aspx,我们的页面使用的cshtml。
从代码上看,这里是唯一的区别了。
...全文
182 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
_Joker_ 2017-03-10
  • 打赏
  • 举报
回复
引用 15 楼 hanjun0612 的回复:
前台页面发出来看看
公司的代码,不方便发出来。 问题已经解决了,还是模型引用的问题。 同事查出来的。 这一行代码还是可以放出来看的。如下。 @model PagedList<Welfare.Models.Menu> 这段加在页面头部。
正怒月神 2017-03-10
  • 打赏
  • 举报
回复
前台页面发出来看看
_Joker_ 2017-03-10
  • 打赏
  • 举报
回复
引用 13 楼 hanjun0612 的回复:
那我就奇怪了,你的var pagelist = new PagedList<Menu>(menuData, pageindex, pagesize);的确是pageList<T>类型。 怎么会调不到呢。。。。 你重新生成,编译时能通过的把?
能通过,就是在cshtml页面出错误,运行之后会提示错误。
正怒月神 2017-03-10
  • 打赏
  • 举报
回复
那我就奇怪了,你的var pagelist = new PagedList<Menu>(menuData, pageindex, pagesize);的确是pageList<T>类型。 怎么会调不到呢。。。。 你重新生成,编译时能通过的把?
_Joker_ 2017-03-10
  • 打赏
  • 举报
回复
引用 11 楼 hanjun0612 的回复:
@Html.Pager(Model) 这个model是PagedList<T>类型吗?
下面这三行代码,是controller中的代码 var menuData= new GetMenuBLL().getMenu(); var pagelist = new PagedList<Menu>(menuData, pageindex, pagesize); return View(pagelist); 之后返回给cshtml中,cshtml中的model就是这个返回值。
正怒月神 2017-03-10
  • 打赏
  • 举报
回复
@Html.Pager(Model) 这个model是PagedList<T>类型吗?
_Joker_ 2017-03-10
  • 打赏
  • 举报
回复
引用 9 楼 hanjun0612 的回复:
奇怪了,你的扩展方法和mvc是在同一个项目下,还是分开的类库?
是在同一个项目下的。
正怒月神 2017-03-10
  • 打赏
  • 举报
回复
奇怪了,你的扩展方法和mvc是在同一个项目下,还是分开的类库?
_Joker_ 2017-03-10
  • 打赏
  • 举报
回复
引用 6 楼 hanjun0612 的回复:
[quote=引用 5 楼 yz2653410 的回复:] using 命名空间指令只能应用于命名空间;“System.Web.Mvc.PagerExtension”是一个类型,而不是命名空间
@using System.Web.Mvc 习惯性引用了类名。哈哈,忘记是扩展方法[/quote] 额……还是一样,报了一楼的错误 编译错误 “System.Web.Mvc.HtmlHelper<dynamic>”没有名为“Pager”的适用方法,但似乎有一个具有该名称的扩展方法。扩展方法不能进行动态调度。请考虑强制转换动态参数,或调用该扩展方法但不使用扩展方法语法。
_Joker_ 2017-03-10
  • 打赏
  • 举报
回复
引用 5 楼 yz2653410 的回复:
[quote=引用 4 楼 hanjun0612 的回复:] 很明显@Html.Pager是别人写的扩展方法。 前台头部添加 @using System.Web.Mvc.PagerExtension 试试
出现了编译错误。 using 命名空间指令只能应用于命名空间;“System.Web.Mvc.PagerExtension”是一个类型,而不是命名空间[/quote] 额……还是一样,报了一楼的错误 编译错误 “System.Web.Mvc.HtmlHelper<dynamic>”没有名为“Pager”的适用方法,但似乎有一个具有该名称的扩展方法。扩展方法不能进行动态调度。请考虑强制转换动态参数,或调用该扩展方法但不使用扩展方法语法。
正怒月神 2017-03-10
  • 打赏
  • 举报
回复
引用 5 楼 yz2653410 的回复:
using 命名空间指令只能应用于命名空间;“System.Web.Mvc.PagerExtension”是一个类型,而不是命名空间
@using System.Web.Mvc 习惯性引用了类名。哈哈,忘记是扩展方法
_Joker_ 2017-03-10
  • 打赏
  • 举报
回复
引用 4 楼 hanjun0612 的回复:
很明显@Html.Pager是别人写的扩展方法。 前台头部添加 @using System.Web.Mvc.PagerExtension 试试
出现了编译错误。 using 命名空间指令只能应用于命名空间;“System.Web.Mvc.PagerExtension”是一个类型,而不是命名空间
正怒月神 2017-03-10
  • 打赏
  • 举报
回复
很明显@Html.Pager是别人写的扩展方法。 前台头部添加 @using System.Web.Mvc.PagerExtension 试试
_Joker_ 2017-03-10
  • 打赏
  • 举报
回复
引用 1 楼 hanjun0612 的回复:
你先看看cshtml头部的引用,有哪些命名空间。 我怀疑你调用的可能是第三方的分页控件。
以下是分页的代码 下面这段是分页,已经成功,至少是能看到第一页
using System;
using System.Collections.Generic;
using System.Linq;

namespace System.Collections.Generic
{
    public class PagedList<T> : List<T>
    {

        /// <summary>
        /// 页索引
        /// </summary>
        public int PageIndex { get; private set; }

        /// <summary>
        /// 页大小
        /// </summary>
        public int PageSize { get; private set; }

        /// <summary>
        /// 总数据条数
        /// </summary>
        public int TotalCount { get; private set; }

        /// <summary>
        /// 总页数
        /// </summary>
        public int TotalPages { get; private set; }

        public PagedList(List<T> source, int pageIndex, int pageSize)
        {
            PageIndex = pageIndex;
            PageSize = pageSize;
            TotalCount = source.Count();
            TotalPages = (int)Math.Ceiling(TotalCount / (double)PageSize);

            this.AddRange(source.Skip((PageIndex-1) * PageSize).Take(PageSize));
        }
        /// <summary>
        /// 是否包含上一页
        /// </summary>
        public bool HasPreviousPage
        {
            get
            {
                return (PageIndex > 1);
            }
        }

        public bool HasNextPage
        {
            get
            {
                return (PageIndex  < TotalPages);
            }
        }
    }
}
下面这段是输入分页页码,上一页下一页的
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc.Html;
using System.Web.Routing;

namespace System.Web.Mvc
{
    public static class PagerExtension
    {


        public static string Pager<T>(this HtmlHelper html, PagedList<T> data)
        {
            //数字导航的开始数字
            int start = (data.PageIndex - 5) >= 1 ? (data.PageIndex - 5) : 1;
            //数字导航的结束数字
            int end = (data.TotalPages - start) > 10 ? start + 10 : data.TotalPages;

            //路由数据
            RouteValueDictionary vs = html.ViewContext.RouteData.Values;
            //URL数据
            var queryString = html.ViewContext.HttpContext.Request.QueryString;
            //合并URL数据
            foreach (string key in queryString.Keys)
                if (queryString[key] != null && !string.IsNullOrEmpty(key))
                    vs[key] = queryString[key];
            //合并表单数据
            var FormString = html.ViewContext.HttpContext.Request.Form;
            foreach (string key in FormString.Keys)
                vs[key] = FormString[key];
            //输出分页Html
            var builder = new StringBuilder();
            builder.AppendFormat("<div class=\"pager\"><ul>");
            //显示首页和上页
            if (data.HasPreviousPage)
            {
                vs["pageIndex"] = 1;
                builder.Append("<li>" + LinkExtensions.ActionLink(html, "首页", vs["action"].ToString(), vs) + "</li>");
                vs["pageIndex"] = data.PageIndex - 1;
                builder.Append("<li>" + LinkExtensions.ActionLink(html, "上页", vs["action"].ToString(), vs) + "</li>");
            }
            //显示数字页码
            for (int i = start; i <= end; i++)
            {
                vs["pageIndex"] = i;
                if (i == data.PageIndex)
                {
                    builder.Append("<li><a class='current'>" + i.ToString() + "</a></li>");
                }
                else
                {
                    builder.Append("<li>" + LinkExtensions.ActionLink(html, i.ToString(), vs["action"].ToString(), vs) + "</li>");
                }
            }
            //显示下页和末页
            if (data.HasNextPage)
            {
                vs["pageIndex"] = data.PageIndex + 1;
                builder.Append("<li>" + LinkExtensions.ActionLink(html, "下页", vs["action"].ToString(), vs) + "</li>");
                vs["pageIndex"] = data.TotalPages;
                builder.Append("<li>" + LinkExtensions.ActionLink(html, "末页", vs["action"].ToString(), vs) + "</li>");
            }
            builder.Append("<li>共" + data.TotalCount + "条 第" + data.PageIndex + "页/共" + data.TotalPages + "页</li> </ul></div>");
            return builder.ToString();
        }
    }
}
这两个是我那分页的程序代码,例子里面的,我直接拿过来用了。 cshtml页面的代码,头部没有任何引用。 只有 @Html.Pager(Model) 这段代码,然后就出现1楼的问题。
正怒月神 2017-03-10
  • 打赏
  • 举报
回复
比如,你使用了
@using Webdiyer.WebControls.Mvc;
代码可能是这样的
@Html.Pager(Model, new PagerOptions
                           {
                               PageIndexParameterName = "pageIndex",
                               ContainerTagName = "ul",
                               PrevPageText = "Prev",
                               NextPageText = "Next",
                               FirstPageText = "First",
                               LastPageText = "Last",
                               CssClass = "hz_page tc",
                               PagerItemsSeperator = "",
                               CurrentPagerItemWrapperFormatString = "<li><a href=\"#\" class=\"activity\">{0}</a></li>",
                               PagerItemWrapperFormatString = "<li>{0}</li>"
                           },
                        new { id = "xpager" })
那么你应该先添加第三方的引用 MvcPager
正怒月神 2017-03-10
  • 打赏
  • 举报
回复
你先看看cshtml头部的引用,有哪些命名空间。 我怀疑你调用的可能是第三方的分页控件。

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧