2017-08-31 25 views
0

我想實現某個功能,但我不知道從哪裏開始。我將描述我擁有的東西。根據傳入參數調用控制器方法

後端

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

您的實現與您在代碼中指定的內容不一致。

在前端你所描述,其具有一個sourceType字段和source對象屬性的對象,而在後端你超載ApiController方法和單個HTTP方法和端點映射不同REST對象資源(我認爲這是行不通的)。

ApiController沒有神奇的方法來使用您的enum屬性來自動區分對象類型。

一個更簡單(也更好)的實現是爲DatabaseFolder源對象的POST調用分別設置ApiController類。這遵循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 
    { 
    } 

} 
相關問題