【问题标题】:Web API 2.2 OData Controller supporting class hierarchyWeb API 2.2 OData 控制器支持类层次结构
【发布时间】:2015-05-24 19:24:32
【问题描述】:

我正在尝试创建一个支持强制转换操作的 ODataController。

假设我们有派生自 Shape 的 Shape 类和 Circle 类

namespace NS
{
    public abstract class Shape {    
       int Id; 
       int X;
       int Y; 
     }

     public class Circle : Shape {    
        int Radius;
     }
}

我想创建控制器 ShapesController。

public class ShapesController: ODataController
    {
        ShapesContext db = new ShapesContext();

        [EnableQuery]
        public IQueryable<Shape> Get()
        {
            return db.Shapes;
        }
        [EnableQuery]
        public SingleResult<Shape> Get([FromODataUri] int key)
        {
            IQueryable<Shapes> result = db.Shapes.Where(p => p.Id == key);
            return SingleResult.Create(result);
        }
}

对于像这样的请求一切正常

/odata/Shapes
/odata/Shapes(1)

但是像

这样的请求
/odata/Shapes(1)/NS.Circle

导致 404 错误

参考路由约定http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-routing-conventions 我必须创建这样的操作

[EnableQuery]
public SingleResult<Circle> GetCircle([FromODataUri] int key)
{
     IQueryable<Shapes> result = db.Shapes.Where(p => p.Id == key).Cast<Circle >;
     return SingleResult.Create(result);
}

但它没有帮助 - 404。

如何让我的控制器支持投射?或者我的方法完全错误,我误解了原则?

谢谢

【问题讨论】:

    标签: c# odata asp.net-web-api2


    【解决方案1】:

    此示例应该适合您:

    假设我有以下模型:

    public class Product
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
    
    public class Category:Product
    {
        public int Price { get; set; }
    }
    

    我只需要在ProductsController 类中都有这两个控制器操作:

    [EnableQuery]
    public IHttpActionResult GetProduct([FromODataUri] int key)
    {
        return Ok(Proxy.Products.FirstOrDefault(c => c.ID == key));
    }
    
    [EnableQuery]
    public IHttpActionResult GetCategory([FromODataUri] int key)
    {
        return Ok(Proxy.Products.FirstOrDefault(c => c.ID == key));
    }
    

    两者都有

    Products(2)/ODataV4Service.Models.Category
    

    Products(2)
    

    将分别支持正确的上下文 URL。

    【讨论】:

    • 感谢@Yi Ding,帮助我找到了正确的答案。
    【解决方案2】:

    我解决了这个问题。它不在控制器中,而是以我提出请求的方式。 所以,只有当我把 / 放在最后 o reqest 时,一切才能正常工作,就像那样

    /odata/Shapes(1)/NS.Circle/
    

    【讨论】:

    • 这是一个错误。不应需要尾部斜杠。
    猜你喜欢
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多