以 IEnumerable 形式检索 Json 数据

Posted

技术标签:

【中文标题】以 IEnumerable 形式检索 Json 数据【英文标题】:Retrieve Json Data as a IEnumerable 【发布时间】:2021-01-21 03:10:17 【问题描述】:

目标: 将包含许多数据的 json 数据从前端发送到后端。

问题: 当我将数据发送到后端时,我不会将其作为 IEnumerable 检索

我遗漏了代码的哪一部分?

信息: *使用 JQuery 作为前端 *使用 Asp.net mvc 作为后端

谢谢!

@
    ViewData["Title"] = "Home Page";

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>


<button class="testtest">
    dfdf
</button>

<script type="text/javascript">

    $('.testtest').click(function () 

        var txt = '"name":"John", "age":30, "city":"New York"'
        var obj = JSON.parse(txt);

        $.ajax(
            url: '@Url.Action("TestGet")',
            data:
            
                contactcollection: obj
            ,
            dataType: 'json',
            type: 'Get',
            contentType: 'application/json',
            success: function (result) 

                var display = '';


                return;
            
        );

    );

</script>

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using JsonData.Models;

namespace JsonData.Controllers

    public class HomeController : Controller
    
        public IActionResult Index()
        
            return View();
        


        [HttpGet]
        public JsonResult TestGet(IEnumerable<Contact> contactcollection)
        

            int ddd = 23;

            return Json(null);
        
    

    public class Contact
    
        public string name;
        public int age;
        public string city;
    

【问题讨论】:

在控制器方法中放置一个断点,然后在 Watch 窗口中检查 Request.Form 的内容。我想看看数据是否存在或根本不存在。 【参考方案1】:

无法通过 HttpGet 发送 IEmunerable 数据。您应该尝试 HttpPost 方法发送数据。然后,将您的数据放入请求正文中,您的控制器应该是:

[HttpPost]
public JsonResult TestGet([FromBody]IList<Contact> contactcollection)

    int ddd = 23;

    return Json(null);

【讨论】:

我尝试了您的解决方案,但它不起作用。我也从前端的 Get 更改为 Post 我忘记添加 [Frombody] 属性。请重新测试。 我再次尝试了您的解决方案,但它不起作用。我也从前端的 Get 更改为 Post【参考方案2】:

我想我明白这里发生了什么。你告诉你的控制器期待一个IEnumerable&lt;Contact&gt;,但你实际上只是传递了一个Contact。将您的 JSON 字符串更改为

var txt = '"contactcollection":["name":"John", "age":30, "city":"New York"]'
var obj = JSON.parse(txt);

然后将您的 ajax 更改为:

$.ajax(
        url: '@Url.Action("TestGet")',
        data:obj,
        dataType: 'json',
        type: 'Post',
        contentType: 'application/json',
        success: function (result) 

            var display = '';


            return;
        
    );

并使用 POST 而不是 GET

【讨论】:

【参考方案3】:
var values = ['1', '2', '3'];

// Make the ajax call
$.ajax(
    type: "POST",
    url: '@Url.Action("done")',
    data:  ids: values ,
    dataType: "json",
    success: function (result) 
        alert('Yay! It worked!');
    ,
    error: function (result) 
        alert('Oh no :(');
    
);

    [HttpPost]
    public JsonResult done(List<string> ids)
    
        bool data = false;

        if (data)
        
            Response.StatusCode = (int)HttpStatusCode.BadRequest;
            return Json("The attached file is not supported", MediaTypeNames.Text.Plain);
        
        else
        
            Response.StatusCode = (int)HttpStatusCode.OK;
            return Json("Message sent!", MediaTypeNames.Text.Plain);
        
    

来源

AJAX Post of JavaScript String Array to JsonResult as List<string> Always Returns Null?

https://www.c-sharpcorner.com/article/asp-net-mvc-how-to-use-ajax-with-json-parameters/

Sending a javascript array to code behind(c#) using ajax

Jquery Ajax, return success/error from mvc.net controller

【讨论】:

以上是关于以 IEnumerable 形式检索 Json 数据的主要内容,如果未能解决你的问题,请参考以下文章

具有 IEnumerable<ISomeInterface> 类型属性的 NewtonSoft.Json 序列化和反序列化类

将 Json 数据传递给handsontable

为啥在我的反应形式中此 FormArray 更改后,我从 JSON 文件中检索对象时收到此错误消息?

使用 System.Text.Json 从 json 文件读取到 IEnumerable

从通过 jQuery/jQueryMobile 中的 AJAX 调用检索到的 JSON 数据正确设置变量

在 C# 中从 Web 检索匿名类型