asp.net核心路由值到基本控制器并可选择覆盖操作

时间:2017-06-02 11:50:44

标签: c# asp.net-mvc asp.net-core

我有一个基本控制器,我的大多数api逻辑都在这里。我想标准化api动词,我希望这个基本控制器默认处理大多数请求,除非我从这个控制器继承并覆盖特定的动作。

给出这样的路径:“/ api / Socks / Get?apiKey = 1”我可以这样做:

[Route("api/[controller]/[action]")]
public class RestDbApiController : Controller
{
    [HttpGet]
    public virtual async Task<JsonResult> Get(string apiKey = null) {

.....

public class SockController : RestDbApiController
{}

这没关系 - 即。请求被路由到基本控制器上的操作。问题是我必须声明SockController,否则请求将不会路由。

我希望能够将所有请求路由到“/ api / xxxxx”到基本控制器,而不必声明任何其他控制器。如果有任何办法,请告诉我。

为什么我要这样做? 我正在尝试使用外部脚本定义创建一个通用控制器。根据控制器名称,它将从类似命名的脚本文件中读取脚本。我希望能够将脚本文件添加到目录中并使其工作就像那样,而无需在代码中进行任何声明

2 个答案:

答案 0 :(得分:3)

这实际上并不可行。从技术上讲,您可以将通配符路由绑定到控制器,但这会吞下所有内容。换句话说,所有的API路由都将永远地命中此基本控制器,然后您必须在该基本控制器内基本设置自己的路由基础结构,以将请求重新路由到正确的控制器。如果不是很明显,这是一个非常糟糕的主意。

要做的最好的事情实际上是你不想做的事情:实际上定义派生控制器。虽然你可能会认为这是无关紧要的,但它实际上根本不是。它可以使您的代码自我记录。很明显,这是一个处理“袜子”的控制器,但它没有任何特定的逻辑。那是完全可以的。

答案 1 :(得分:1)

我同意@Chris,但如果您只想拥有一个控制器,则可以省略路由定义中的“控制器名称”部分。例如,以下请求将映射到下面的操作方法

/api/Socks/Get?apiKey=1
/api/OtherSocks/Get?apiKey=1

name参数将分别填充为“Socks”,“OtherSocks”:

public class RestDbApiController : Controller
{
    [HttpGet]
    [Route("api/{name}/[action]")]
    public virtual async Task<JsonResult> Get(string name, string apiKey = null) 
    {
        ...
    }
}