MVC 5 Web Api - 从基本控制器继承路由

时间:2013-12-03 14:17:58

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

让控制器从其BaseController继承路由是否“合法”?它似乎是not allowed for Attribute Routing,但通过RouteCollection正常路线注册怎么样?

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

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

我可以举例说明如何在BaseController中完成这项工作,如果不可能,可以选择其他方式。

3 个答案:

答案 0 :(得分:2)

这是有效的:

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";
    }
}

答案 1 :(得分:1)

您是否希望将此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";
    }
}

答案 2 :(得分:1)

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

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