【问题标题】:POST two arrays in JSON to ASP.NET Core MVC 6将 JSON 中的两个数组发布到 ASP.NET Core MVC 6
【发布时间】:2016-07-28 12:52:15
【问题描述】:

前言:我有一个使用 MVC 4 和 .NET v4.6.1 的应用程序,并且工作起来非常棒。一个编辑器模板向控制器发送 AJAX 请求以获取事物列表:

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请求的payload如下:

{“特权”:[“d72c1162-0c3d-e611-953e-00155d9e5c08”,“e32c1162-0c3d-e611-953e-00155d9e5c08”],“特权组”:[“bb2c1162-0c3d-e611-950e-00155d9e” ]}

每当发送 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
}

这可能是由于DefaultContractResolver 我在Startup.cs 中设置的吗?

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

    services.AddKendo();
}

最好的问候, 卡斯滕

PS:你可能已经注意到我正在使用 Telerik 的 Kendo。是的,我在两个应用程序中使用不同的版本。但我不明白,剑道应该如何干涉这里。

【问题讨论】:

  • 只是为了确保它不是 .Net Core 的 Kendo UI MVC wapper 问题,您可以删除 DataSourceRequest 吗?然后只发布这两个数组。

标签: asp.net-core asp.net-core-mvc


【解决方案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
}

【讨论】:

  • 请原谅我的表达:但这很糟糕。它确实有效!但是为什么我现在必须这样做呢?你有一个链接到一些解释这个的文档吗?我已经用另一个调用更新了我的帖子,该调用使用另一种内容类型但没有附加模型。也许您可以对此有所了解。
  • 对不起,我不知道你为什么不能使用数组作为模型。可能其他人有这方面的信息。我也想知道。
  • 我偶然发现了答案:“最多允许从消息正文中读取一个参数。[..] 这条规则的原因是请求正文可能存储在一个非只能读取一次的缓冲流。” (请参阅asp.net/web-api/overview/formats-and-model-binding/…)不幸的是,我不能再测试它了——我们现在切换回 MVC 5。
猜你喜欢
  • 1970-01-01
  • 2017-07-22
  • 2018-05-23
  • 1970-01-01
  • 2014-05-28
  • 2019-11-12
  • 2018-09-20
  • 2019-01-18
  • 2012-11-26
相关资源
最近更新 更多