2016-09-16 93 views
0

當我在MVC控制器如何將Json參數綁定到ASP.NET中的Web Api參數?

[HttpPost] 
public async Task<ActionResult> MyMethod(int param1, string param2) 
{ 
    //.... 
} 

這種方法我可以送一個JSON對象{param1:1, param2:"str"}只是正常工作和參數都解決了。但是,當我爲WebApi 2執行此操作時不起作用。由於[FromBody]只能按文件中的以下示例使用1個參數。

At most one parameter is allowed to read from the message body 
    // Caution: Will not work!  
    public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... } 

如何從WebApi控制器獲得相同的MVC控制器行爲?

編輯:創建相應的類和替換參數不是一個選項,因爲消息傳遞工具會檢查這些方法以進行維護。簽名應該保持不變。

+0

您編輯提供不可能的任務 - 最多一個參數可以從正文讀取爲:「此規則的原因是請求正文可能存儲在一個只能讀取一次的非緩衝流「。 –

+0

@VadimLevkovsky你是絕對正確的。但是,由於簽名保持不變,我只是讓方法同時接受GET和POST。當我們用URL中的參數發送GET時,它就起作用了。 – ozgur

+0

無法做到這一點是無效的 – Ewan

回答

1

嘗試從這些值構成一個對象:

public class Foo 
{ 
    public int id {get;set;} 
    public int name {get;set;} 
} 

public HttpResponseMessage Post([FromBody] Foo foo) 
{ 
    //some stuff... 
} 

如果簽名應保持不變,你可以嘗試在URL中指定參數,可以這樣:myurl?id=1&name=Tom仍然通過POST動詞。

+0

簽名應保持不變,因爲消息傳遞基礎結構會不時檢查這些控制器方法。我會用這個細節編輯我的問題。 – ozgur

0

如果你要傳遞多個參數,請使用類對象

public class PortalClass 
{ 
    public ApplicationModel applicationModel { get; set; } 
    public string user_id { get; set; } 
    public string id { get; set; } 
    public object pageCollection { get; set; } 
} 

public object GetApplication(PortalClass data) 
{ 
    JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All, PreserveReferencesHandling = PreserveReferencesHandling.None }; 
    var myObject=JsonConvert.DeserializeObject<PageCollection>(data.pageCollection.ToString(), settings) 
    return null; 
} 

客戶端:

var data = { 
    user_id: userId, 
    id: id 
}; 

http.post(url, data).then(
    function (response) { 

}, function (err) { 
    callback.reject(err); 
}); 
+0

簽名應保持不變,因爲消息傳遞基礎結構會不時檢查這些控制器方法。 – ozgur

2

你可以嘗試這樣的:

public HttpResponseMessage Post([FromBody]dynamic value) 
{ 
    int id= value.id.ToString(); 
    string name = value.name.ToString(); 
} 

並通過json像followin g

{ 
    "id":"1", 
    "name":"abc" 
} 
+0

不要對這些事情使用動態,因爲您通常知道從前端獲得的數據。 –

+0

是的,但是如果你不想創建新的類來傳遞值給一個方法,並且你在控制器中有很多方法,那麼你會怎麼做? –

+0

我確實創建了類。所有請求/響應都可能具有語義(甚至物理)值域對象。爲什麼不把它們明確地暴露爲類?如果有很多類沒有意義 - 我會把它當作代碼味,並考慮API重構。 –