【问题标题】:Inherited Web API API Controller继承的 Web API API 控制器
【发布时间】:2012-04-18 22:23:06
【问题描述】:

我有几节课

Square : Rectangle : Shape (abstract)

我有一个从 ApiController 继承的基本控制器,我想使用它。

public abstract class BaseController<T> : ApiController where T : class
{
    public abstract IEnumerable<T> Get()
    ...
}

public class DerivedController : BaseController<Rectangle>
{
    public override IEnumerable<Rectangle> Get()
    ...
}

public class AnotherDerivedController : BaseController<Square>
{
    public new IEnumerable<Square> Get()
    ...
}

/api/rectangle 会正确调用IEnumerable&lt;Rectangle&gt; Get()

/api/square 会给我一个错误:

Multiple actions were found that match the request: 
System.Linq.IEnumerable`1[Square] Get() on type Web.Api.Controllers.AnotherDerivedController 
System.Linq.IEnumerable`1[Rectangle] Get() on type Web.Api.Controllers.DerivedController

如果我将public new IEnumerable&lt;Square&gt; Get() 更改为public override IEnumerable&lt;Square&gt; Get(),我会收到编译时错误,因为返回签名不同

如何让我的代码调用正确的方法?是否需要在 RegisterRoutes 中显式注册每个类的方法?

【问题讨论】:

    标签: c# asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    你需要重写Get,你基本上是用new来使用它。这是行不通的,因为该类将有两个 Get 方法,而 Web API 将无法选择哪一个。

    您可以将BaseController 定义为abstract,将Get 定义为virtualabstract,然后在您的DerivedController 中实现。

    【讨论】:

    • 嗨 Aliostad,我更新了我的问题以反映您的更改。我在这里仍然遇到一些问题,但是您的建议对我很有帮助。谢谢。
    【解决方案2】:

    您目前有两个控制器可以使用您的 square 类。你是如何注册你的路线的?如果你将控制器重命名为 rectangleController 和 SquareController 你可能会没事的。

    【讨论】:

    • 现在,我只有默认路由 routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }); 在我的实际代码中,我确实有 (RectangleController) 和 (SquareController)... 但它仍然没有正确路由,给我同样的错误信息。
    猜你喜欢
    • 2018-11-22
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 2012-07-05
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    相关资源
    最近更新 更多