对于如何在MVC中最佳地定义和组织路线,是否有最佳实践?
我工作的公司运营着一个非常广泛,复杂的电子商务网站,每天有大约600,000个独立访问者。
问题在于:在我们的Global.asax.cs中,我们在RegisterRoutes()
中有大约75个路径定义的巨大列表:
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
除了在Global.asax.cs中有这个巨大的列表之外,还有更好的方法来定义这些路由吗?
因为我们有很多开发人员,其中一半是不称职的,我不能回过头来重构这些路线,所以要花几分钟才能确定哪个控制器负责提供URL的视图。 / p>
我该怎么办?
一位开发人员辛苦建立一个原型,允许我们在Global.asax.cs中执行此操作:
public static void RegisterRoutes(RouteCollection routes)
{
routes.Include(new RootController());
routes.Include(new AccountController());
routes.Include(new HelpController());
routes.Include(new SearchController());
// etc., for each controller
}
在此原型中,Include()
是一种扩展方法,所有控制器都从IRoutedController
继承,后者提供Include()
IEnumerable<Route>
个Route
列表以添加到RouteCollection
。
但是使用这个原型,我们遇到了一个新问题:我们现在必须猜测哪个Controller负责特定的URL,而不是查看route.MapRoute()
调用列表来查找特定URL调用的控制器。检查其IRoutedController
路由列表,看看URL是否实际调用了我们猜到的控制器。不是那么难,但有时需要检查Global.asax.cs中75 + Route
的列表。
这是一个更好的解决方案吗?
是否有任何好的解决方案?
我们应该继续向Global.asax.cs添加路由;我们应该给原型绿灯吗?或者我们应该做别的事情? (假设您不能重构现有的路由URL以使它们更合乎逻辑。)
答案 0 :(得分:2)
对不起,你在说什么? :P
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
此单一路径条目有效地允许您使用任何参数调用任何控制器的任何操作方法。
这是一个更好的解决方案吗?
可能不是。
有什么好的解决方案吗?
是。但是你需要分享更多的路线才能确定。
我们应该继续向Global.asax.cs添加路由;我们应该给原型绿灯吗?或者我们应该做别的事情?
不,不,是的。你需要分享一定数量的路线才能更好地了解情况。
(假设您不能重构现有的路由URL以使它们更合乎逻辑。)
但你可以确保新的符合默认路线,所以问题不会持续增长,即{controller} / {action}
答案 1 :(得分:1)
我会将路径信息存储在xml文件或数据库中,并将其加载到global.asax中。我可以添加额外的列/属性,将示例url路由,以便我可以快速搜索它。更不用说,我可以更新路线信息而无需重建项目(当然,如果有新的控制器,视图等,那么嘿需要打包在新的dll中)。