MVC3 路线与区域..有点混乱
本文关键字:混乱 区域 MVC3 | 更新日期: 2023-09-27 18:30:27
我有一个MVC3网站,有2个区域加上公共区域。 我还指定了用于分页项目列表的路线。 我的Register_Routes
方法如下所示:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Paginate", // Route name
"{controller}/Paginate/{itemsPerPage}/{pageNumber}/{searchString}", // URL with parameters
new { controller = "Home", action = "Index", itemsPerPage = SiteSettings.ItemsPerPage, pageNumber = 1, searchString = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
我注意到(并且不明白)的是,如果我从主页注销,则从我的登录页面重定向如下所示
http://localhost:62695/Account/LogOn?ReturnUrl=%2fHome%2fPaginate
。登录后,我最终进入了我的主页,除了以下 URL:
http://localhost:62695/Home/Paginate
在这一点上,我相当确定我已经搞砸了路线图,但这对我来说似乎是对的。 我做错了什么?
更新根据建议,我将路线更改为如下所示:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Paginate", // Route name
"{controller}/Paginate/{itemsPerPage}/{pageNumber}/{searchString}", // URL with parameters
new { controller = "Home", action = "Index", searchString = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
。主页索引页似乎确实可以正常工作,但现在分页不能:
return RedirectToAction("Paginate", new { itemsPerPage = SiteSettings.ItemsPerPage, pageNumber = 1, searchString = string.Empty });
在 Admin''HomeController 中生成 URL:
http://localhost:62695/Admin/Users/Paginate?itemsPerPage=25&pageNumber=1
所以我在这里仍然做错了什么。
更新 2好的,这就是我让它按照我想要的方式工作的方式:我的RegisterRoutes
方法现在如下所示:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
null,
"{area}/{controller}/Paginate/{itemsPerPage}/{pageNumber}/{searchString}", // URL with parameters
new {area = string.Empty, controller = "Home", action="Paginate", searchString = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
"Default", // Route name
"{area}/{controller}/{action}/{id}", // URL with parameters
new {area = string.Empty, controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
。但这还不足以解决路由问题。 除此之外,我还需要将路由添加到我的区域注册中。 我的管理区域注册如下所示:
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
null,
"Admin/{controller}/Paginate/{itemsPerPage}/{pageNumber}/{searchString}", // URL with parameters
new { controller = "Home", action = "Paginate", searchString = UrlParameter.Optional } // Parameter defaults
);
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
除了为我的连接更改为RedirectToRoute
之外,这还使我的 URL 都很漂亮并同时工作。 所有的答案都有助于实现我的目标,我+1'每个人,并选择了让我最接近路径的答案。
路由按其注册顺序进行评估。重定向由您注册的第一个路由生成,特别是因为您为所有分段声明了默认值。您可能需要考虑定义更具体的路由
更新使用重定向到路由而不是重定向到操作来生成所需的 URL
RedirectToRoute("Paginate", new { itemsPerPage = SiteSettings.ItemsPerPage, pageNumber = 1, searchString = string.Empty });
routes.MapRoute(null, // do not name your routes, it's a "magic string"
"{controller}/Paginate/{itemsPerPage}/{pageNumber}/{searchString}",
new
{
controller = "Home",
action = "Index",
searchString = UrlParameter.Optional
}
);
// instead of RedirectToAction, try RedirectToRoute, and do not use the route name
return RedirectToRoute(new
{
controller = "Home",
area = "AreaName",
itemsPerPage = SiteSettings.ItemsPerPage,
pageNumber = 1,
searchString = string.Empty,
}
);
好吧,您返回 URL http://localhost:62695/Home/Paginate
的原因是,当您登录时,您会返回到指定的 URL,即http://localhost:62695/Account/LogOn?ReturnUrl=%2fHome%2fPaginate
的?ReturnUrl=%2fHome%2fPaginate
部分。这不是您主页的网址吗?您从未指定。
可能是第一个定义也优先,不知道我在哪里听到的,所以也许如果你把默认定义放在第一位,它会抓住它。