更新 - 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
以上内容很容易处理,因为部门/团队别名位于 Uri 的主机名中。
但是,当我想实现以下内容时,我无法让它令人满意地工作:
http://company.com/department/team/Action/id
http://company.com/department/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");
}
}
但是,使用此方案,所有从此类继承的控制器(并使用上面列出的路由进行适当的路由)在其操作处理程序中都期望(我认为是冗余/不需要的)参数。我想避免让每个处理程序都需要这些“额外”参数并且正在寻找建议。
谢谢!-乔治