2017-01-29 230 views
3

我有一個工作正常的MVC 5項目,我需要將該項目遷移到使用.NET核心的MVC 6。在設法調整一切工作之後,我遇到了一個問題:我的許多操作接受多於一個對象作爲參數。模型綁定器MVC 5正在使用沒有問題,但MVC 6似乎將null放在這些動作的所有參數中,我想這是MVC和WebAPI統一的一部分。我的問題是,如果無論如何還有附加而不添加請求封裝器對象的另一個模型庫。

例如 :
將多個對象作爲參數傳遞給mvc 6 action

[HttpPost] 
    public ActionResult GetVersionData(OvlEnvironment environment, Pipeline pipeline) 
    { 
     BL.SetEnviromentVersion(pipeline, environment); 
     return PartialView("_Version", environment); 
    } 

在包含在表單

{ "environment" : {*Data...*}, 
    "pipeline" : {*Data...*} 
} 

JSON數據的MVC 5項目Ajax請求被接受。在mvc 6中,響應相同請求的兩個對象都顯示爲空。
謝謝

+0

請提供一個具體的例子 –

+0

OK,添加了一個例子 –

+1

嘗試添加[FromBody]例如GetVersionData([FromBody] OvlEnvironment環境,[FromBody]管道管道) –

回答

4

您必須給ASP.NET核心MVC框架提示,即要在發佈請求的正文中找到要綁定到該模型的數據。這是通過[FromBody] attribute完成的。

[FromBody]:使用配置的格式化程序綁定來自 請求主體的數據。格式化程序是基於 請求的內容類型來選擇的。

通過設計,不可能將多個參數綁定到一個JSON源,如here所述。爲了避免更多的模型類,你可以使用一個通用的JObject這樣的:

[HttpPost] 
public ActionResult GetVersionData([FromBody] JObject data) 
{ 
    var environment = data["environment"].ToObject<OvlEnvironment>(); 
    var pipline = data["pipeline"].ToObject<Pipeline>(); 

    BL.SetEnviromentVersion(pipeline, environment); 
    return PartialView("_Version", environment); 
} 
+0

「我的問題是如果有反正它沒有添加另一個模型請求封裝器對象庫「。因爲我確定我不是第一個遇到這個問題的人,所以我認爲有人可能會有解決方案 –

+0

如果已經將鏈接添加到GitHub問題,它在哪裏聲明,它不可能綁定正文JSON輸入多個參數對象。因此需要尋求其他解決方案。通過使用JObject(JSON.net由ASP.NET Core MVC內部使用,因此不再添加其他模型庫),您可以避免爲數據傳輸定義類。另一種解決方案是將多個參數組合到一個對象中。 –

+0

我會想到一個自定義模型綁定器\格式化程序來處理這個問題,可惜我沒有時間,也沒有想寫一個,而且可惜這樣做,因爲微軟已經使用MVC的早期版本。我的目標不是在遷移過程中更改大量代碼。我認爲創建強類型的包裝器對象實際上是一個更好的解決方案,而不僅僅是接受包含我所有操作的JObject,就好像我正在使用鬆散類型的語言一樣。在這兩種解決方案中我都在改變很多代碼。我正在尋找一種方法,讓我保持原狀。如果沒有一個,生活會很糟糕 –

相關問題