c# - MVC 中用于分页的映射路由

标签 c# asp.net-mvc pagination

我使用的分页类与 NerdDinner 示例中使用的类非常相似。分页方面工作正常,但我正在努力让所有路线正常工作。

目前我们有一套MapRoute:

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}/{page}", // URL with parameters
            new
            {
                controller = "Home",
                action = "Index",
                id = UrlParameter.Optional,
                page = UrlParameter.Optional
            } // Parameter defaults
        );

我们希望 URL 是 /mycontroller/myaction/1/page5 而不是 /mycontroller/myaction/1/5 这样更有意义给用户。我目前找不到执行此操作的方法。

其次,我们如何设置路由,以便操作也可以与分页一起使用。 IE。 /controller/page1 而不是 /controller/index/page1

最佳答案

你应该有两条路线:

首先用于分页(将使用默认 Controller 和操作):

    routes.MapRoute(
        "Default", // Route name
        "home/{id}/{page}", // URL with parameters
        new
        {
            controller = "Home",
            action = "Index",
            id = UrlParameter.Optional,
            page = UrlParameter.Optional
        } // Parameter defaults
    );

所有 Controller 的最后一条路线:

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}/{page}", // URL with parameters
        new
        {
            controller = "Home",
            action = "Index",
            id = UrlParameter.Optional,
            page = UrlParameter.Optional
        } // Parameter defaults
    );

所以上面的路由/home/1/page5 将由 home controller index action 处理, 但是 someController/someAction/1/page5 通过第二条路线。

您应该知道,首先您需要放置处理较少 url 的路由,而不是普通路由,例如上面针对所有 Controller 的第二条路由。

同样在 Controller 操作中,您可以像这样重新查看路由参数:

string page = RouteData.Values["page"];

因此对于上面示例页面中的 url home/1/page5 将等于“page5”,您可以解析此字符串以获得页码。

至于我,我使用以下方法从路由数据、帖子正文、查询字符串中获取参数:

 protected T GetQueryParam<T>(String name, T defValue = default(T))
        {
            String param = HttpContext.Request.QueryString.Get(name);
            if (String.IsNullOrEmpty(param))
                param = HttpContext.Request.Params[name];
            if ( String.IsNullOrEmpty(param))
                param = (String) RouteData.Values[name] ?? String.Empty;

            if (String.IsNullOrEmpty(param) )
                return defValue;

            return (T)Convert.ChangeType(param, typeof(T));
        }

因此,如果您需要使用上述方法获取页面,您只需执行以下操作:

var page = GetQueryParam<string>("page");// in case if page parameter not exists default value for type will be returned

关于c# - MVC 中用于分页的映射路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4509019/

相关文章:

c# - 为什么我收到 'an unhandled exception of type system executionengineexception occurred in system data dll' 错误?

c# - 当某些内容缓存在 c# asp.net 中时,它是缓存在服务器上还是客户端上?

c# - 在没有回发的客户端过滤 Grid.Mvc

cakephp - CakePHP 2.0+ 中使用 Group By 进行分页

javascript - 在 angularJS 中更改分页中的 URL

c# - 如何对 FileInfo[] 数组进行排序

c# - 动画在 Wpf 中不起作用

asp.net-mvc - 如何将 URL 参数绑定(bind)到具有不同名称的模型属性

CSS :after overriding existing styles

php - 一页中的 Laravel 多页分页