我使用的分页类与 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/