代码之家  ›  专栏  ›  技术社区  ›  Giorgio Galante

对于不太常见的情况,ASP.NET MVC路由的最佳方式是什么?

  •  2
  • Giorgio Galante  · 技术社区  · 16 年前

    更新-1/21/09:

    我唯一能让它正常工作的方法就是创建具有附加路径信息的路由…换言之,不是 http://company.com/myDepartment/myTeam/action/id ,需要构建路由来处理路径 喜欢 http://company.com/department/myDepartment/team/myTeam 等等。

    结束更新-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参数。我更希望能够“预处理”基本控制器类中的department/team 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 回复  |  直到 16 年前
        1
  •  2
  •   Jero    16 年前

    首先,您不需要departmentandteam2或departmentandteam3。departmentandteam1可以处理它,因为它具有controller、action和id的默认值。

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

    对于URL

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

    使用路线

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

    注意“controller”将始终是“home”,因为它从未在url中提及。

    对于不想指定部门和团队id的操作和url,它们应该只通过所有其他路由,并使用默认路由。事实上,它们并不是被先前的一条路线抓住。我认为如果你修复了之前的路由问题,那么它应该修复需要额外id的问题。

    最后,如果您仍然有问题,请尝试使用像phil haacked的mvc路由调试器 http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx . 我用它来解决我的一些路由的问题,看看它实际在做什么和运行时是非常有帮助的。

        2
  •  0
  •   Kevin Pang    16 年前

    这个怎么样(我没有测试,因为我不确定除了这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" });