根据传入参数调用控制器方法

时间:2017-08-31 07:25:03

标签: c# asp.net typescript asp.net-web-api

我想实现某种功能,但我不知道从哪里开始。我将描述我所拥有的。

后端

public enum SourceType { Database, Folder }
public class DatabaseSource
{
    public string ServerName { get; set; }
    public string DatabaseName { get; set; }
}
public class FolderSource
{
    public string FolderName { get; set; }
}
public class TestController : ApiController
{
    [HttpPost]
    [Route("source")]
    public void Post([FromBody]DatabaseSource source) //method one
    {
    }

    [HttpPost]
    [Route("source")]
    public void Post([FromBody]FolderSource source) //method two
    {
    }

}

前端

 export enum SourceType {
    Database,
    Folder
}
export class DatabaseSource {
    public ServerName: string;
    public DatabaseName: string;
}
export class FolderSource {
    public FolderName: string;
}

var source = new DatabaseSource();
source.ServerName = "serverName";
source.DatabaseName = "dbName";

var obj = {
    sourceType: SourceType.Database,
    source: source
};

现在想象一下,我会将obj发送到服务器。我希望根据枚举调用特定的控制器方法。我怎么能这样做?

P.S。这个例子大大简化了。

1 个答案:

答案 0 :(得分:1)

您的实现与您在代码中指定的内容不一致。

在前端,您描述的对象具有sourceType字段和source对象属性,而在后端,您正在重载ApiController方法并映射不同的REST对象资源到单个HTTP方法和端点(我相信它不起作用)。

ApiController没有神奇的方法可以使用enum属性自动区分对象类型。

更简单(更好)的实现是为ApiControllerDatabase源对象POST调用提供单独的Folder类。这遵循REST API设计的原则,您基本上将基本CRUD操作映射到具有对象类型的HTTP方法。

如果您打算基于这些参数对象执行操作,请通过端点的API路由阐明意图,如下所示:

public class TestController : ApiController
{
    [HttpPost]
    [Route("ETLLoad/Database/source")]
    public void Post([FromBody]DatabaseSource source) //method one
    {
    }

    [HttpPost]
    [Route("ETLLoad/Folder/source")]
    public void Post([FromBody]FolderSource source) //method two
    {
    }

}