Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于不太常见的场景,ASP.NET MVC路由的最佳方式是什么?_Asp.net_Asp.net Mvc_Routing_Url Routing - Fatal编程技术网

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

对于不太常见的场景,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

更新-1/21/09:

我唯一能让它正常工作的方法就是创建包含额外路径信息的路由。。。换句话说,需要构建路由来处理路径,而不是 比如等等

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

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

上面的代码很容易处理,因为部门/团队别名位于Uri的主机名中

但是,当我想要实现以下功能时,我无法让它令人满意地工作:

以下是我定义的路线:

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