C# MVC中分页的映射路由

C# MVC中分页的映射路由,c#,asp.net-mvc,pagination,C#,Asp.net Mvc,Pagination,我使用的分页类与NerdDinner示例中使用的非常类似。分页方面工作得很好,但我正在努力让所有的路径正常工作 目前我们有一套MapRouteset: routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}/{page}", // URL with parameters new {

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

目前我们有一套
MapRoute
set:

        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/5
,而是
/mycontroller/myaction/1/page5
,这样对用户更有意义。我现在找不到一个办法来做这件事


其次,我们如何设置路由,以便操作也可以用于分页。也就是说,
/controller/page1
而不是
/controller/index/page1
您应该有两条路线:

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

所有控制器的最后路线:

    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控制器索引操作处理, 但是一些控制器/someAction/1/page5通过第二条路线

您应该知道,首先您需要放置处理较少URL和较常见路由的路由,就像上面针对所有控制器的第二个路由一样

此外,在控制器操作中,您还可以按如下方式查看路由参数:

string page = RouteData.Values["page"];
所以对于上面示例中的url home/1/page5,页面将等于“page5”,您可以解析此字符串以获得页码

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

 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));
        }
protectedt GetQueryParam(字符串名称,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(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
var page=GetQueryParam(“page”);//如果页面参数不存在,将返回类型的默认值
使用
“{controller}/{action}/{id}/page{page}”
将使您的URL看起来像
/mycontroller/myaction/1/page5
。关于你的第二个问题,你能详细说明你所说的
是什么意思吗?我们如何设置路由,以便操作也可以与分页一起使用
var page = GetQueryParam<string>("page");// in case if page parameter not exists default value for type will be returned