2016-07-28 45 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。 –