对于不常见的场景,ASP.NET MVC路由的最佳方法是什么?

时间:2009-01-15 18:48:12

标签: asp.net asp.net-mvc routing url-routing

更新 - 1月21日:

我能够让这个工作得到适度的唯一方法是创建具有额外路径信息的路线...换句话说,而不是 http://company.com/myDepartment/myTeam/action/id ,路线需要被构建来处理路径 比如 http://company.com/department/myDepartment/team/myTeam 等等。

END UPDATE - 1/21/09:

我有两种可能的URL约定,我需要能够路由到相同的控制器/视图

http://team.department.company.com/Action/id

http://department.company.com/Action/id

http://company.com/Action/id

上述内容非常容易处理,因为部门/团队别名是Uri的主机名。

然而,当我想实施以下内容时,我一直无法令人满意地工作:

http://company.com/department/team/Action/id

http://company.com/department/Action/id

http://company.com/Action/id

以下是我定义的路线:

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参数。我真的更喜欢能够“预处理”我在OnActionExecuting事件处理程序中获得的基本控制器类中的部门/团队id值。我吠叫错了树吗?我是否需要实现自己的Mvc Route处理程序?

注意:这将取代旧版应用,并且需要保留/维护URL格式。

编辑:首先,感谢目前为止的回复。根据我收到的回复,我想我在某一方面还不够清楚。这(松散地)是我的控制器的样子:

public class ControllerBase : Controller
{
    DepartmentDTO department;
    TeamDTO team;
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        PopulateDept(filterContext.ActionParameters("departmentId");
        PopulateTeam(filterContext.ActionParameters("teamId");
    }
}

但是,使用此方案,所有从此类继承的控制器(并使用上面列出的路由进行适当路由)都会在其操作处理程序中期望(我认为是冗余/不可用的)参数。我想避免让每个处理程序都需要这些“额外”参数,并且正在寻找建议。

谢谢! -Giorgio

2 个答案:

答案 0 :(得分:2)

首先,您不需要departmentAndTeam2或departmentAndTeam3。 departmentAndTeam1可以处理它,因为它具有controller,action和id的默认值。

我注意到的另一件事是你的示例网址都没有指定控制器。在这种情况下,请将其保留在路由之外,并将其保留为默认值。例如

表示网址

http://company.com/department/team/Action/id

使用路线

routes.MapRoute("departmentAndTeam1", "{departmentId}/{teamId}/{action}/{id}", new { controller = "Home", action = "Index", id = "" });

请注意“控制器”将永远是“主页”,因为它从未在URL中提及过。

对于您不想指定部门和团队ID的操作和URL,它们应该只是通过所有其他路由并仅使用默认路由。事实上,他们并不意味着他们被一条早期的路线抓住了。我想如果你修复了早期路线的问题,那么它应该解决需要额外ID的问题。

最后,如果您仍然遇到麻烦,请尝试使用像Phil Haacked http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx这样的MVC路由调试器。我用它来解决我的一些路线的问题,看看它实际上在做什么和运行时真的很有帮助。

答案 1 :(得分:0)

这个怎么样(我没有测试过,因为我不确定除了那些特定的网址映射之外你还有什么要求)?

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" });