ASP.NET MVC5 中的复杂路由

Complex routing in ASP.NET MVC5

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

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

我的想法是:

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)
    {
        ...
    }
}

只需确保将 放在默认路由 之前,这样它会先捕获。有关自定义路由的更多信息,请参阅:http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/creating-custom-routes-cs

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

// routes.MapMvcAttributeRoutes();

然后,在您的操作中定义如下路线:

[Route("event/{eventId}/device/{deviceId}")]
public ActionResult Device(int eventId, int deviceId)
{
    ...

您也可以在控制器上使用 [RoutePrefix] class 移动部分路线以应用到整个控制器。例如:

[RoutePrefix("event")]
public class EventController : Controller
{
    [Route("{eventId}/device/{deviceId}")]
    public ActionResult Device(int eventId, int deviceId)
    {
        ...
    }
}

有关属性路由的更多信息,请参阅:http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx