如何从ajax将多个json数组传递给控制器​​?

Posted

技术标签:

【中文标题】如何从ajax将多个json数组传递给控制器​​?【英文标题】:How to pass multiple json array to controller from ajax? 【发布时间】:2020-12-05 17:08:55 【问题描述】:

我有两个 json 数组。我正在尝试将这些 json 数组发送到我的控制器。当我想发送其中一个时,一切都很好,但我无法发送第二个。我该如何解决?

视图发布功能

function HobiIlgiAlanKaydetGuncelle() 

    var hobiler = $('#Hobiler').val(); // Json array of object
    var ilgiAlanlar = $('#IlgiAlan').val();

    $.ajax(
        url: "/Kullanici/HobiVeIlgiAlanlariniKaydetGuncelle",
        type: "POST",
        contentType: 'application/json; charset=UTF-8',
        dataType: 'json',
        data: hobiler : hobiler,ilgiAlanlar : ilgiAlanlar,
        success: function (response)  

    );

控制器

[HttpPost]
public async Task<JsonResult> HobiVeIlgiAlanlariniKaydetGuncelle([FromBody] List<HobilerVM> hobiler, List<IlgiAlanlarVM> ilgiAlanlar)

   //When I put second parameter, both of them comes with null    

HobilerVM

public class HobilerVM

    public int id  get; set; 
    public string value  get; set; 

IlgiAlanVM

public class IlgiAlanVM

    public int id  get; set; 
    public string value  get; set; 

【问题讨论】:

这能回答你的问题吗? MVC3 & JSON.stringify() ModelBinding returns null model JSON.stringify(hobiler : hobiler,ilgiAlanlar : ilgiAlanlar) 应该这样做... 我认为这对您的问题很有用:***.com/questions/14407458/… 参数已经被 tagify 库字符串化。当我只发送 hobiler 时,我可以不使用 stringify 发送。 @Trinity:你使用的是哪个版本的 MVC? 【参考方案1】:

问题在于以下行:

data: hobiler : hobiler,ilgiAlanlar : ilgiAlanlar

这是 javascript 中的一个对象。 c#中的等价物应该是:

public class MyData 
    public List<HobilerVM> hobiler;
    public List<IlgiAlanlarVM> ilgiAlanlar;

然后在你的控制器中:

    [HttpPost]
    public async Task<JsonResult> HobiVeIlgiAlanlariniKaydetGuncelle([FromBody] MyData data)
    
       //When i put second parameter, both of them comes with null    
    

欲了解更多信息,请查看Why does ASP.NET Web API allow only one parameter for POST method?

【讨论】:

我做了你的,但仍然带有 null。 在将 JSON 指定为 contentType 时也不发送 JSON 你是什么意思? 是所有数据对象为空还是只是第二个属性? 当我输入第二个参数时,所有数据对象都带有 null。但是当我发送单个参数(例如 hobiler)时没有问题。【参考方案2】:

Web API 不允许您在 Web API 控制器方法的方法签名——你只能发布一个 Web API 操作方法的单个值。这个值反过来甚至可以 成为一个复杂的对象。可以传递多个值 通过将一个参数映射到实际的 POST 或 PUT 操作 内容和其余的通过查询字符串。参考:How to pass multiple parameters to Web API controller methods 和 How WebAPI does Parameter Binding

解决方案

public class ComplexObject 
   property List<HobilerVM> Hobiler  get; set; 
   property List<IlgiAlanlarVM> IlgiAlanlar  get; set; 


[HttpPost]
public async Task<JsonResult> HobiVeIlgiAlanlariniKaydetGuncelle([FromBody] ComplexObject data)

 //When i put second parameter, both of them comes with null    

编码愉快,干杯!

【讨论】:

仍然带有null。 数据:hobiler : hobiler,ilgiAlanlar : ilgiAlanlar 将其更改为数据:hobiler : JSON.stringify(hobiler),ilgiAlanlar : JSON.stringify(ilgiAlanlar)【参考方案3】:

我试过你的代码,除了某些东西之外,它对我来说很好。

首先,您的第二个参数与您在代码中发布的内容具有不同的 ViewModel:

public class IlgiAlanVM

   public int id  get; set; 
   public string value  get; set; 

但在您的参数上,您使用的是不同的 ViewModel:

([FromBody] List<HobilerVM> hobiler, List<IlgiAlanlarVM> ilgiAlanlar)

正如您在此处看到的,IlgiAlanVMList&lt;IlgiAlanlarVM&gt; 不同

其次,我只是使用了相同的代码,但没有[FromBody]。那就是:

//I already edited your List of Model here on the second parameter from IlgiAlanVM to IlgiAlanlarVM
[HttpPost]
public async Task<JsonResult> HobiVeIlgiAlanlariniKaydetGuncelle
                          (List<HobilerVM> hobiler, List<IlgiAlanlarVM> ilgiAlanlar) 

最后,我只是确保它是一个对象数组,以确保它能够很好地绑定到您的模型列表中:

        var hobiler = [
            id: 1,
            value: 'My Value'
        ];
            
        var ilgiAlanlar = [
            id: 1,
            value: 'MyValue'
        ];

       $.ajax(
            url: '@Url.Action("HobiVeIlgiAlanlariniKaydetGuncelle", "Kullanici")',
            type: "POST",
            contentType: 'application/json; charset=UTF-8',
            dataType: 'json',
            data: JSON.stringify( hobiler : hobiler, ilgiAlanlar : ilgiAlanlar ),
            success: function (response)  
        );

【讨论】:

以上是关于如何从ajax将多个json数组传递给控制器​​?的主要内容,如果未能解决你的问题,请参考以下文章

将 KnockoutJS 可观察数组传递给 HTTP Post 控制器方法的 AJax 调用失败

将数组数组从 Ajax 传递给控制器

如何将 Struts 2 动作类中的 InputStream 值传递给 JSP 页面中的 Ajax 并将该值转换为 JSON 数组

如何将对象类型的 json 数组传递给 MVC 控制器类

如何使用 ajax 传递 from.serialize() 和数组值?

将数组从ajax调用传递给控制器​​,控制器中的数组为空