【问题标题】:Ajax-Call to get JSON Result from Controller (returning IList) in Asp.Net MVC always errorsAjax-Call 从 Asp.Net MVC 中的控制器(返回 IList)获取 JSON 结果总是错误
【发布时间】:2019-04-10 22:37:21
【问题描述】:

我正在尝试进行 AJAX 调用 (Javascript),以便在控制器方法中创建 IList

index.js:

function getList() {
    $.ajax({
        url: myUrl, 
        type: "GET",
        dataType: "json",    
        success: function (response) {
            if (response) {
                //do sth
            }
        },
        error: function (response) {   
            alert("error");  //always error
            console.log(response); //object with just default functions
        }
   });

}

MyController.cs:

 public IList<SomeItem> loadList()
 {
        var items = db.SomeItemSet.Include(item => item.Sth).ToList();

        IList<SomeItem> resultList = new List<SomeItem>();

        for (int i = 0; i < items.Count(); i++)
        {
            //if(condition)
               resultList.Add(items[i]);                  
        }
        return resultList;
}

public JsonResult loadListJson()
{
    return Json(new { response = loadList() }, JsonRequestBehavior.AllowGet);
}

Controllermethod 中的断点显示它已被执行。该列表不为空。

我还尝试将该方法声明为 Action Result(返回没有 jsonreqbehaviour 的 json)并在 ajax-Call 中执行 type: POST。您认为这里有什么可能会失败?

网络调试面板显示代码

302:找到

(但不是 200:OK)尝试加载 ListJson 时。

例外:

System.InvalidOperationException:检测到循环引用 在序列化类型对象时 'System.Data.Entity.DynamicProxies.SomeItem_9D..'。在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
在 ...

【问题讨论】:

  • 实际错误是什么? alert("error") 没有告诉你任何有用的信息。检查response 变量。检查浏览器的开发者控制台。在浏览器的网络调试面板中检查服务器的实际响应。它可能会告诉你到底出了什么问题。
  • 将响应对象记录到控制台,看看里面有什么。
  • 这不太可能是实际问题,但是将列表包装在子属性中(即new { response = loadList() })似乎有点毫无意义,除非您计划将来添加更多属性?只需return Json(loadlist(),... 就足够了,你会得到一个数组。无论如何,正如其他人所说,您不需要猜测(也不需要我们猜测)您的 AJAX 调用出了什么问题……您的浏览器提供开发人员工具是有原因的。检查工具中的控制台和/或网络屏幕,看看您的请求发生了什么。
  • 嗯,好的。感谢更新。我认为这是因为您正在尝试直接序列化实体框架对象,并且通常这些对象包含循环引用(例如,包含表示另一个相关表的对象的属性,该表本身具有包含表示第一个表的对象的属性,其中包含...等)。当然,您不能以 JSON 等分层文本数据格式表示循环自引用数据结构。
  • 通常的解决方案是使用 DTO / ViewModel 对象作为中介,而不是直接序列化 EF 对象。无论如何,这是一个很好的做法,即使你没有这个问题。您可以使用 AutoMapper 之类的工具来减轻从 EF 对象转换到 DTO 的乏味(如有必要,还可以再转换回来)。还有一个快速而肮脏的选项可以更改您的 JSON 序列化设置以忽略循环引用并截断对象

标签: c# json list model-view-controller asp.net-ajax


【解决方案1】:

您的对象结构中似乎存在循环引用。JSON 序列化程序不支持。试试Select() 方法。如下所示。

 var items = db.SomeItemSet.Include(item => item.Sth).Select(s=> new SomeItemDto{
 // which properties you need
}).ToList();

【讨论】:

    【解决方案2】:

    我使用 Newtonsoft.Json.JsonConvert 来转换我的列表!

    index.js:

    function getList() {
        $.ajax({
            url: myUrl, 
            type: "POST", //
            dataType: "json",    
        success: function (list) {
            if (list) {
                //do sth 
            }
        },
        error: function (response) { //do sth }
       });
    }
    

    MyController.cs:

     public ActionResult loadListJson()
            {
                return Content(Newtonsoft.Json.JsonConvert.SerializeObject(loadList()), "application/json");
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多