【问题标题】:MVC 5 Web Api - Inheriting route from base controllerMVC 5 Web Api - 从基本控制器继承路由
【发布时间】:2013-12-19 15:41:26
【问题描述】:

让控制器从其 BaseController 继承路由是否“合法”?好像是not allowed for Attribute Routing,但是通过RouteCollection进行正常的路由注册呢?

原因是我目前有一堆控制器,每个控制器都代表某种文件转换器。他们每个人都有一套通用的方法来上传要转换的文件。这些方法是每个控制器上的端点,而不仅仅是私有方法。我希望以下路线有效:

/api/controller1/uploadfile
/api/controller2/uploadfile
/api/controller3/uploadfile

我能否举个例子,如何在 BaseController 中完成此操作,如果不可能,请提供替代方法。

【问题讨论】:

标签: asp.net-mvc asp.net-web-api


【解决方案1】:

以下是有效的:

public abstract class BaseUploaderController : ApiController
{
    [HttpGet, Route("uploadfile")] //Needs both because HttpGet("uploadfile") currently only supported in MVC attribute routing 
    public string UploadFile() 
    {
        return "UploadFile";
    }
}


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

【讨论】:

  • 是的,很可能是这种情况,抱歉。看看 AttributeRouting 是否提供了解决方案。 attributerouting.net/#asp-net-mvc
  • 我假设您设置了命令式路由?这些路由属性使您看起来好像可以使用属性路由,但这对我不起作用。
【解决方案2】:

您是否希望将此UploadFile 操作放置在基本控制器中,并且从它们继承的其他控制器应该仍然能够像您在帖子中提到的那样从它们各自的路由中点击UploadFile?如果是,您可以创建一个抽象的基本 api 控制器并将此 UploadFile 操作放入其中,您对各个控制器的请求应该会按预期工作。

例子:

public abstract class BaseApiController : ApiController
{
    // POST /api/Values
    // POST /api/Test
    public string UploadFile()
    {
        return "UploadFile";
    }
}

public class TestController : BaseApiController
{
    // GET /api/test/10
    public string GetSingle(int id)
    {
        return "Test.GetSingle";
    }
}

public class ValuesController : BaseApiController
{
    // GET /api/values/10
    public string GetSingle(int id)
    {
        return "Values.GetSingle";
    }
}

【讨论】:

  • 嘿抱歉,这要么不起作用,要么我的问题不清楚。通过您的设置,我希望 api/values/uploadfileapi/test/uploadfile 都成为有效路线并点击 UploadFile 方法。目前它认为“上传文件”是我传递给 api/value/{int} 路由的整数,并且会引发转换错误。我需要它来代替基类
  • 好的..我只是想举个例子...但是假设你有一个像api/{controller}/{id}, id = RouteParameter.Optional这样的路由,那么像POST /api/test/uploadfile这样的请求确实会命中基本的UploadFile方法。 ..你能分享一下你的路线是如何设置的吗?
  • 谢谢你的例子。那是我的路线,它不起作用。给出我在评论中描述的错误。我在一个全新的项目中使用了您的示例
  • 我同意,使用基类是行不通的。我认为没有办法使用基类。这很糟糕。
【解决方案3】:

根据这个答案https://stackoverflow.com/a/21610390/122507 属性路由不会被继承。

我目前正在讨论是否在 30 个控制器中引入不必要的方法,以便我可以添加属性路由或向基类方法添加假参数,以使默认路由在 Get(int id) 和 GetHistory(int id, bool history) 我不需要第二个参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    相关资源
    最近更新 更多