3

我一直在试验 MVC WebAPI,很酷的东西。但我在路线的概念上苦苦挣扎。

例如,我有一个 webAPI 项目结构,如下所示:

项目:

  • 控制器
    • 顾客
      • 客户控制器.cs
      • 客户地址控制器.cs
    • 产品
      • ProductCategoriesController.cs
      • 产品控制器

目前我在 WebApiConfig.cs 中定义了一个 API 路由

        config.Routes.MapHttpRoute(
            name: "CustomerApi",
            routeTemplate: "api/customer/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }

当我只有与客户相关的控制器时,这很好用。所以我可以打电话:

  • 获取 api/customer/CustomerAddress/?customerID= 1234

但是现在我已经添加了与配置相关的产品相关控制器(当然)以获得我必须调用 Uri 的产品:

  • GET api/customer/products/?prodID= 5678 *但我不想要这个 Uri

相反,我想要:

  • 获取 api/产品/?prodID= 5678

对于产品类别,我想要类似于:

  • 获取 api/产品/类别/?catID= 1357

我以为我必须做的是添加更多路由,但我找不到如何将各种控制器与我希望它们的路由相关联?

如果我确实添加了另一条路由,我最终会得到两个不同的 uri 路由到我构建的每个控制器。

如何实现我想要的逻辑分区?

4

1 回答 1

7

使用 Web Api 2,您可以顺利地为您的操作定义特定的路由。例如 :

public class CustomerController : ApiController
{
    [Route("api/customer")]
    public IEnumerable<Customer> GetCustomers()
    {
        // ..
    }

    [Route("api/customer/{customerID}")]
    public Customer GetCustomer(int customerID)
    {
        // ..
    }

    [Route("api/customer/CustomerAddresses/{customerID}")]
    public Address GetCustomerAddresses(int customerID)
    {
        // ...
    }
}

public class ProductController : ApiController
{
    [Route("api/product")]
    public IEnumerable<Product> GetProducts()
    {
        // ..
    }

    [Route("api/product/{prodID}")]
    public Product GetProduct(int prodID)
    {
        // ..
    }

    [Route("api/product/categories/{catID}")]
    public Category GetCategory(int catID)
    {
        // ...
    }
}
于 2013-10-24T16:14:05.370 回答