ASP.NET MVC5中的复杂路由

ASP.NET MVC5中的复杂路由,asp.net,asp.net-mvc,asp.net-mvc-5,asp.net-mvc-routing,Asp.net,Asp.net Mvc,Asp.net Mvc 5,Asp.net Mvc Routing,我想知道创建控制器结构的最佳方法 假设我有几个事件,每个事件我可以有几个设备 我的想法是有这样的东西: http://mydomain/event/1/device/4 因此我可以访问deviceId 4(属于eventId 1) 我应该有两个不同的控制器吗?事件和设备或设备信息必须在EventController中 如何在我的RouteConfig中设置此路由?如何设置此路由完全取决于您。您可以使用单独的控制器或同一控制器。没关系 就布线而言,如果使用标准MVC布线,则需要为此创建自定义布线

我想知道创建控制器结构的最佳方法

假设我有几个事件,每个事件我可以有几个设备

我的想法是有这样的东西:

http://mydomain/event/1/device/4
因此我可以访问deviceId 4(属于eventId 1)

我应该有两个不同的控制器吗?事件和设备或设备信息必须在EventController中


如何在我的RouteConfig中设置此路由?

如何设置此路由完全取决于您。您可以使用单独的控制器或同一控制器。没关系

就布线而言,如果使用标准MVC布线,则需要为此创建自定义布线:

routes.MapRoute(
    "EventDevice",
    "event/{eventId}/device/{deviceId}",
    new { controller = "Event", action = "Device" }
);
这将与以下内容相对应:

public class EventController : Controller
{
    public ActionResult Device(int eventId, int deviceId)
    {
        ...
    }
}
只需确保您将其放置在默认路线之前,这样它就会最先到达。有关自定义管线的详细信息,请参见:

或者,在MVC5+中,您可以使用属性路由,这使得定义自定义路由变得更加容易,如果您正在做很多类似的事情的话。在
RouteConfig.cs
中,取消对行的注释:

// routes.MapMvcAttributeRoutes();
然后,在您的操作中定义路线,如下所示:

[Route("event/{eventId}/device/{deviceId}")]
public ActionResult Device(int eventId, int deviceId)
{
    ...
您还可以在控制器类上使用
[RoutePrefix]
移动部分路由以应用于整个控制器。例如:

[RoutePrefix("event")]
public class EventController : Controller
{
    [Route("{eventId}/device/{deviceId}")]
    public ActionResult Device(int eventId, int deviceId)
    {
        ...
    }
}
有关属性路由的详细信息,请参见: