映射MVC中的分页路由

时间:2010-12-22 12:10:44

标签: 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
        );

我们希望该网址不是/mycontroller/myaction/1/5,而是/mycontroller/myaction/1/page5,因此对用户更有意义。我目前找不到办法做到这一点。

其次,我们如何设置路线,以便动作也可以与分页一起使用。即/controller/page1代替/controller/index/page1

1 个答案:

答案 0 :(得分:1)

您应该有两条路线:

首先进行分页(将使用默认控制器和操作):

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

所有控制器的最后路线:

    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是第二条路线。

您应该知道,首先您需要放置处理网址较少的路由,而不是 - 常用路由,例如上面所有控制器的第二条路由。

同样在控制器动作内部,您可以像这样重新查看路线参数:

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