2

更新 - 2009 年 1 月 21 日:

我能够使其正常工作的唯一方法是创建具有附加路径信息的路由......换句话说,路由需要而不是http://company.com/myDepartment/myTeam/action/id构建以处理http://company.com/department/myDepartment/team/myTeam等路径。

结束更新 - 2009 年 1 月 21 日:

我有两个可能的 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 路由处理程序吗?

注意:这是替换旧版应用程序,需要保留/维护 URL 格式。

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

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

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

谢谢!-乔治

4

2 回答 2

2

首先,您不需要 departmentAndTeam2 或 departmentAndTeam3。departmentAndTeam1 可以处理它,因为它具有控制器、操作和 id 的默认值。

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

对于网址

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 路由调试器。我用它来解决我的一些路线的问题,看看它实际在做什么和运行时真的很有帮助。

于 2009-01-16T00:54:44.857 回答
0

这个怎么样(我没有测试过,因为我不确定除了这 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" });
于 2009-01-16T01:11:43.747 回答