对于不太常见的场景,ASP.NET MVC路由的最佳方式是什么?
更新-1/21/09: 我唯一能让它正常工作的方法就是创建包含额外路径信息的路由。。。换句话说,需要构建路由来处理路径,而不是 比如等等 结束更新-2009年1月21日: 我有两个可能的URL约定,我需要能够路由到相同的控制器/视图 上面的代码很容易处理,因为部门/团队别名位于Uri的主机名中 但是,当我想要实现以下功能时,我无法让它令人满意地工作: 以下是我定义的路线:对于不太常见的场景,ASP.NET MVC路由的最佳方式是什么?,asp.net,asp.net-mvc,routing,url-routing,Asp.net,Asp.net Mvc,Routing,Url Routing,更新-1/21/09: 我唯一能让它正常工作的方法就是创建包含额外路径信息的路由。。。换句话说,需要构建路由来处理路径,而不是 比如等等 结束更新-2009年1月21日: 我有两个可能的URL约定,我需要能够路由到相同的控制器/视图 上面的代码很容易处理,因为部门/团队别名位于Uri的主机名中 但是,当我想要实现以下功能时,我无法让它令人满意地工作: 以下是我定义的路线: routes.MapRoute("departmentAndTeam1", "{departmentId}/{t
routes.MapRoute("departmentAndTeam1", "{departmentId}/{teamId}/{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" });
routes.MapRoute("departmentAndTeam2", "{departmentId}/{teamId}/{controller}/{action}", new { controller = "Home", action = "Index" });
routes.MapRoute("departmentAndTeam3", "{departmentId}/{teamId}/{controller}", new { controller = "Home", action = "Index" });
routes.MapRoute("department", "{department}/{controller}/{action}/{id}", new {controller = "Home", action = "Index", id = ""});
routes.MapRoute("departmentAndTeam4", "{departmentId}/{teamId}/", new { controller = "Home", action = "Index"});
routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" });
我现在遇到的问题是,控制器中的每个操作方法都需要departmentId&teamId参数。我真的更希望能够“预处理”基本控制器类中的部门/团队id值,这是我在OnActionExecuting事件处理程序中得到的。我找错树了吗?我是否需要实现自己的Mvc路由处理程序
注意:这将取代传统应用程序,需要保留/维护URL格式
编辑:首先,感谢您的回复。根据我收到的回复,我认为有一点我还不够清楚。这就是我的控制器(大致)的外观:
public class ControllerBase : Controller
{
DepartmentDTO department;
TeamDTO team;
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
PopulateDept(filterContext.ActionParameters("departmentId");
PopulateTeam(filterContext.ActionParameters("teamId");
}
}
但是,使用此方案,从此类继承的所有控制器(并使用上面列出的路由进行适当路由)在其操作处理程序中预期(我认为是冗余的/未指定的)参数。我希望避免让每个处理程序都需要这些“额外”参数,我正在寻找建议
谢谢!
-乔治首先,你不需要部门和团队2或部门和团队3。departmentAndTeam1可以处理它,因为它具有控制器、操作和id的默认值 我注意到的另一件事是,没有一个示例URL中指定了控制器。在这种情况下,将其保留在路由之外,并将其保留为默认值。乙二醇 对于URL 使用路线
routes.MapRoute("departmentAndTeam1", "{departmentId}/{teamId}/{action}/{id}", new { controller = "Home", action = "Index", id = "" });
注意“controller”将始终是“Home”,因为URL中从未提到过它
对于不希望指定部门和团队ID的操作和URL,它们应该只经过所有其他路由,并使用默认路由。事实上,他们不是,这意味着他们是被一个较早的路线抓住了。我认为,如果你修复了早期路线的问题,那么它应该修复需要额外ID的问题
最后,如果您仍然有问题,请尝试使用Phil Haacked提供的MVC路由调试器。我用它来解决一些路由的问题,看看它实际在做什么和运行时非常有用 这个怎么样(我没有测试,因为我不确定除了这3个特定URL映射之外,您还有什么要求)
routes.MapRoute("1", "{department}/{team}/{action}/{id}", new { controller = "Home" });
routes.MapRoute("2", "{department}/{action}/{id}", new { controller = "Home" });
routes.MapRoute("3", "{action}/{id}", new { controller = "Home" });