2016-07-28 42 views
0

前言:我有一個MVC 4和.NET v4.6.1的應用程序,它像一個魅力一樣工作。一個編輯模板發送一個AJAX請求到控制器得到的事情的清單:將JSON中的兩個數組POST到MVC 6核心MVC 6

function showEffectiveRights(e) { 
    $.ajax({ 
     contentType: "application/json", 
     data: JSON.stringify({ 
      privileges: $("#AssignedPrivileges").getKendoMultiSelect().value(), 
      privilegeGroups: $("#AssignedGroups").getKendoMultiSelect().value() 
     }), 
     dataType: "json", 
     success: function (data) { 
      // Stuff 
     }, 
     error: function (data) { 
      showResponseMessages(data); 
     }, 
     type: "POST", 
     url: '@Url.Action("EffectiveRights", "User")' 
    }); 
} 

控制器看起來是這樣的:

[AcceptVerbs(HttpVerbs.Post)] 
public JsonResult EffectiveRights([DataSourceRequest] DataSourceRequest request, Guid[] privileges, Guid[] privilegeGroups) 
{ 
    // Stuff 
} 

POST請求的有效載荷如下:

{"privileges":["d72c1162-0c3d-e611-953e-00155d9e5c08","e32c1162-0c3d-e611-953e-00155d9e5c08"],"privilegeGroups":["bb2c1162-0c3d-e611-953e-00155d9e5c08"]}

每當發送AJAX請求時,變量privilegesprivilegeGroups都有來自客戶端的信息。好極了!

讓我們來解決這個問題。我的新應用程序應該使用MVC 6和.NET Core。根據NuGet,我使用的每個圖書館都是最新的。 JavaScript是完全一樣的。控制器只得到另一屬性(它不與AcceptVerbs工作,要麼):

[HttpPost] 
public JsonResult EffectiveRights([DataSourceRequest] DataSourceRequest request, Guid[] privileges, Guid[] privilegeGroups) 
{ 
    // Stuff 
} 

的有效載荷和這兩個申請的請求頭是相同的。但無論出於何種原因,變量privilegesprivilegeGroups都不包含任何元素。

我試圖添加[FromBody]但這也沒有幫助。

https://stackoverflow.com/a/38493849/4944034也有類似的問題。但他只發送一個對象,我有兩個。而建議的解決方案並不適合我。

爲了完成這項工作我需要做些什麼改變?

編輯 我在同一頁上有類似的東西。數據由Kendo的一個組件提交。內容類型是application/x-www-form-urlencoded和有效載荷看起來是這樣的:

profileId=8f96c1bb-5c68-4071-a423-ab2a7ba8234f&selectedPrivileges=1410335f-9e35-4454-a7e9-77c7d24bf5df&selectedGroups=60d0ec60-c820-47d7-acea-f4d57f221e5c

控制器是很好的能夠接收這兩個數組:

[HttpPost] 
public JsonResult PrivilegeListForUser([DataSourceRequest]DataSourceRequest request, Guid[] selectedPrivileges, Guid[] selectedGroups) 
{ 
    // Stuff 
} 

可能這是由於DefaultContractResolverStartup.cs正在設置?

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc() 
     .AddJsonOptions(options => 
     { 
      options.SerializerSettings.ContractResolver = new DefaultContractResolver(); 
     }); 

    services.AddKendo(); 
} 

最好的問候, 卡斯滕

PS:你可能已經注意到,我使用Telerik的劍道。是的,我在這兩個應用程序中使用不同的版本。但我不明白,劍道在這裏應該如何幹預。

+0

只是爲了確保它不是劍道UI MVC wapper問題與.net核心,你可以刪除** ** DataSourceRequest?然後只發布這兩個數組。 – Win

+0

這裏沒有運氣...... –

回答

1

創建一個模型類,並使用它:

public class InputModel 
{ 
    public Guid[] privileges { get; set; } 

    public Guid[] privilegeGroups { get; set; } 
} 

[HttpPost] 
public JsonResult EffectiveRights([DataSourceRequest] DataSourceRequest request, [FromBody]InputModel model) 
{ 
    // Stuff 
} 
+0

請原諒我這句話:但這很糟糕。它工作,的確如此!但爲什麼我現在必須這樣做?你有鏈接到一些文件,這是解釋?我使用另一種內容類型的另一個調用更新了我的帖子,但沒有添加額外的模型。也許你可以點亮這一點。 –

+0

對不起,我不知道爲什麼你不能使用數組作爲模型。可能是其他人有關於此的信息。我也想知道。 –

+0

我意外地偶然發現了答案:「最多隻允許一個參數從消息體中讀取。\ [..]這個規則的原因是請求主體可能存儲在非緩衝流中,只能是隻讀一次。「 (見http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api)不幸的是,我無法再測試它 - 我們切換現在回到MVC 5。 –