当URL超过3级时,如何处理URL路由? (RESTful URL)

时间:2015-07-08 18:09:15

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

因此,假设您需要在RESTful路由中使用这些URL:

/Company/About

/Company/Product/View
/Company/Product/Edit

/Company/Contact/View
/Company/Contact/Edit

我假设所有这些操作都需要在同一个控制器(即公司)中,我还假设路由在Global.asax中看起来像这样:

public static void RegisterRoutes(RouteCollection routes)
{
     routes.MapRoute("mission", "Company/Product/{action}/{id}",
          new { controller = "Company", id = "" });

     routes.MapRoute("mission", "Company/Contract/{action}/{id}",
          new { controller = "Company", id = "" });

     routes.MapRoute(
          "Default",                                              
          "{controller}/{action}/{id}",                           
          new { controller = "Home", action = "Index", id = "" } 
     );
}

当试图将所有这些塞入一个控制器时出现问题(同样,我的假设是在同一控制器中具有所有这些是正确的),因为控制器动作名称将使一切都搞乱。这就是我的意思:

在此示例中,我们将需要在公司控制器中命名为以下的控制器操作:

About (for Company/About)

ProductView (for /Company/Product/View)
ProductEdit (for /Company/Product/Edit)

ContactView (for /Company/Contact/View)
ContactEdit (for /Company/Contact/Edit)

但是,这些操作名称与路由表所期望的不匹配。例如,如果用户浏览/ Company / Product / View,则路由将直接流向Company控制器中名为“View”的操作。如果用户浏览/ Company / Contact / View会怎样?路由将流程路由到公司控制器中的同一“视图”表。如何将这些请求路由到不同的视图?

您如何解决这个问题?我的目标是尽可能地保持RESTful。

1 个答案:

答案 0 :(得分:0)

首先要成为RESTful,不应该在路由名称中包含操作。您应该通过http谓词路由,而不是在路线中指定编辑或视图。我还建议使用属性路由

这是一个示例控制器:

[RoutePrefix("api/company")]
public class CompanyController : ApiController
{
    [Route("product"), HttpGet]
    public Product ViewProduct()
    {
    }

    [Route("product"), HttpPut]
    public Product EditProduct()
    {
    }

    [Route("contact"), HttpGet]
    public Product ViewContact()
    {
    }

    [Route("contact"), HttpPut]
    public Product EditContact()
    {
    }
}