从通用控制器覆盖单个方法

时间:2014-12-01 14:21:55

标签: c# generics override

我有一个抽象类

public abstract class BaseController<T,K> : ApiController
{
  //several methods

  [Route("{id:int}")]
  public HttpResponseMessage Put(int id, [FromBody]T item)
  {
    //updates the item
  }
}

我有6个继承BaseController并使用声明的方法的其他类(控制器)。我需要覆盖UserController上的put方法,并且只在UserController上。 我试过了:

public abstract class BaseController<T,K> : ApiController
{
  //several methods

  [Route("{id:int}")]
  public virtual HttpResponseMessage Put(int id, [FromBody]T item)
  {
    //updates the item
  }
}

public class UserController : BaseController<User, UserDT>
{
  [Route("{id:int}")]
  public override HttpResponseMessage Put(int id, [FromBody]User item)
  {
    //updates the user
  } 
}

但它会引发错误:Multiple actions were found that match the request

如何覆盖方法?

--- ---- EDIT 这是我的WebApiConfig

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API routes
        config.MapHttpAttributeRoutes(new CustomDirectRouteProvider());

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

--- --- EDIT 添加了[Route("{id:int}")]

1 个答案:

答案 0 :(得分:1)

取消覆盖的Route属性。这是基于id:int路由和正文的数据类型生成2个相同的路由。由于多态性,仍将执行覆盖以代替基本方法。