0

使用 Web API,我需要将以下两个 Restful 路由重定向到两个不同的操作方法:

/products/2 -> 获取产品 id 2 的信息

/products?someOptionalId=456 -> 获取所有产品的信息。如果提供,请使用 someOptionalId 作为过滤器。

不幸的是,使用标准路由和模型绑定方案,因为两个 URL 都指向同一个产品控制器并且有一个 id 作为参数,我要么遇到编译时问题,创建两个具有相同 int 参数的 Get 方法,要么运行时问题MVC 无法选择特定的操作方法

编译时错误

public IQueryable<Product> Get(int someOptionalIdQs)
{

}

public Product Get(int id)
{

}

运行时错误(注意 hack 为 someOptionalIdQs 使用字符串,然后转换为 int)

public IQueryable<Product> Get(string someOptionalIdQs)
{

}

public Product Get(int id)
{

}

考虑到我希望尽可能保持路由干净,请在理想情况下建议修复,而无需进行任何路由配置更改。谢谢。

4

3 回答 3

2

由于您的 Method 有一个可选的 Id 参数,因此您可以简单地将一个可为空的 int 用于集合的 Get。

下面的代码将支持以下网址:

  • http:// 服务器 /api/products
  • http:// 服务器 /api/products?someOptionalIdQs=3
  • http:// 服务器 /api/products/2

代码示例

public class Product
{
    public string Name { get; set; }
}

public class ProductsController : ApiController
{
    public IQueryable<Product> Get([FromUri] int? someOptionalIdQs = null)
    {
        if(someOptionalIdQs.HasValue)
        {
            //apply the filter
        }
        return new List<Product>().AsQueryable();
    }

    public Product Get(int id)
    {
        return new Product();
    }
}
于 2012-11-14T08:49:29.800 回答
0

使用您的第一种方法,但尝试重命名您的一个 Get 方法。请注意,如果操作名称没有“Get”前缀,请确保使用 [HttpGet] 属性。

    // [HttpGet]
    public IQueryable<Product> Get2(int someOptionalIdQs)
    {
    }

    public Product Get(int id)
    {
    }
于 2012-11-14T06:56:42.617 回答
0

您可以做什么可能会查看是否this.HttpContext.Request.QueryString.AllKeys.Contains("someOptionalIdQs")根据选项 ID Qs 进行处理,否则您的正常工作流程将起作用。

But this would be a cryptic implementation an ideally you should create a new URL all together for a different work flow for the app.

于 2012-11-14T08:55:49.657 回答