首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >属性路由和继承

属性路由和继承
EN

Stack Overflow用户
提问于 2013-11-15 05:43:41
回答 3查看 30.3K关注 0票数 66

我正在尝试一个基本控制器,它使用通用存储库为我的API控制器提供基本的CRUD方法,这样我就不必在每个新控制器中复制相同的基本代码。但是我遇到了路由属性在基本控制器中时被识别的问题。为了准确地显示我遇到的问题,我创建了一个非常简单的WebAPI控制器。

当我在主控制器中有一个Get方法,并且它直接从ApiController继承时,我没有任何问题,这是预期的。

代码语言:javascript
复制
[RoutePrefix("admin/test")]
public class TestController : ApiController
{
    [Route("{id:int:min(1)}")]
    public string Get(int id)
    {
        return "Success";
    }
}

当我将Get方法移到一个基本控制器中时,它将返回404页面的内容。

代码语言:javascript
复制
[RoutePrefix("admin/test")]
public class TestController : TestBaseController
{

}

public class TestBaseController : ApiController
{
    [Route("{id:int:min(1)}")]
    public string Get(int id)
    {
        return "Success";
    }
}

一些更有趣的笔记:

  • I可以通过GET /Test/1访问该操作。
  • 当我尝试访问POST /admin/test时,它返回以下JSON

{“Message”:“找不到与请求URI‘admin’匹配的HTTP资源。”,“MessageDetail”:“找不到与名为‘http://test.com/admin/test’的控制器匹配的类型。”}

有没有人知道一种方法,可以让路由与基本控制器的属性一起工作?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-15 06:03:12

属性路由不能继承。这是一个经过深思熟虑的设计决定。我们感觉不对劲,也看不到继承它们有意义的有效场景。

你能给出一个更现实的场景,关于你想要在哪里使用它吗?

Update(3/24/2014)

在即将发布的MVC Web API 5.2版本中,将会有一个名为System.Web.Http.Routing.IDirectRouteProvider的扩展点,通过它您可以启用您在这里寻找的继承场景。您可以自己尝试使用最新的夜间构建(有关如何使用夜间构建的文档请参阅)

Update(7/31/2014)

在Web API 2.2版本中如何做到这一点的示例:

代码语言:javascript
复制
config.MapHttpAttributeRoutes(new CustomDirectRouteProvider());

//---------

public class CustomDirectRouteProvider : DefaultDirectRouteProvider
{
    protected override IReadOnlyList<IDirectRouteFactory> 
    GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
    {
        // inherit route attributes decorated on base class controller's actions
        return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>
        (inherit: true);
    }
}
票数 82
EN

Stack Overflow用户

发布于 2014-07-26 18:00:49

使用Web API 2.2,您可以:

代码语言:javascript
复制
public class BaseController : ApiController
{
    [Route("{id:int}")]
    public string Get(int id)
    {
        return "Success:" + id;
    }
}
[RoutePrefix("api/values")]
public class ValuesController : BaseController
{
}

config.MapHttpAttributeRoutes(new CustomDirectRouteProvider());
public class CustomDirectRouteProvider : DefaultDirectRouteProvider
{
    protected override IReadOnlyList<IDirectRouteFactory> 
    GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
    {
        return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>
        (inherit: true);
    }
}

如下所示:http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-22

票数 27
EN

Stack Overflow用户

发布于 2013-12-04 06:20:41

明白了。

代码语言:javascript
复制
[Route("api/baseuploader/{action}")]
public abstract class BaseUploaderController : ApiController
{
    [HttpGet] 
    public string UploadFile() 
    {
        return "UploadFile";
    }
}


[Route("api/values/{action}")]
public class ValuesController : BaseUploaderController
{
    [HttpGet]
    public string Get(int id)
    {
        return "value";
    }
}

这里需要注意的一点是,路由操作参数必须与操作名称相同。我找不到解决这个问题的办法。(不能使用RouteAttribute重命名路由)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19989023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档