如何在ASP.NET中使用Ajax返回用户定义的数据类型列表?

时间:2014-03-05 18:16:54

标签: asp.net ajax serialization

我正在尝试调用getData web方法,该方法将返回包含cityID,country,city的Destination表记录列表(我正在使用ADO.NET Entity Framework Model),但我收到500内部服务器错误。 如果我创建一个新的Destination对象并将其添加到新列表,则没有错误。该怎么办请帮帮我,我是新手。

enter image description here

控制台错误

无法加载资源:服务器响应状态为500(内部服务器错误)

响应文本:“{”消息“:”在序列化类型为\ u0027System.Data.Entity.DynamicProxies.Dest ......}的对象时检测到循环引用“

在新标签页中打开图片

enter image description here

的.js

function getData() {
    return $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: "Sandbox3.aspx/getData",
        data: JSON.stringify({}),
        dataType: "json",
    });
}

$('button').on('click', function(e) {
    e.preventDefault();

    var promise = getData();

    promise.success(showData);
    promise.error(onError);
});
function onError(xhr, ajaxOptions, thrownError) {
    console.log(xhr);
    alert(xhr.status);
    alert(thrownError);
}

function showData(data) {
    console.log(data.d);
}

.aspx.cs

public partial class Sandbox3 : System.Web.UI.Page
{
    private static HotelDB db = new HotelDB();

    protected void Page_Load(object sender, EventArgs e)
    {
    }

    [System.Web.Services.WebMethod]
    public static List<Destination> getData()
    {
        return db.Destinations.ToList();
    }
}

的.aspx

<body>
<div>
    <form runat="server">
        <button id="box">Go</button>
    </form>
</div>
<script src="scripts/jquery-1.8.3.js"></script>
<script src="scripts/ajaxtest.js"></script>
</body>

2 个答案:

答案 0 :(得分:1)

使用实体框架,您很可能启用了LazyLoading,禁用它并尝试。最有可能发生的是,当您尝试返回EF制作的Desitniation对象时,它具有tblHotelDetails属性,这会导致问题。通过禁用LazyLoading,当您将对象发回时,该属性将不会填充。如果您需要填充它,或者像您一样创建自定义类,或者您可以禁用LazyLoading并使用Include方法将该属性引入,但我不确定是否包含它将导致相同的错误。

如果您想查看实际错误,请获取Fiddler,运行该网站,然后运行您的网站,当您收到500错误时,请查看Fiddler,您将看到实际错误。

答案 1 :(得分:0)

我知道这有点晚了,但也许它会帮助别人。对于JSON,展平并注意任何导航属性(假设像EntityFramework一样的ORM)......

在您的情况下 - 目标导航属性...如果它是导航属性,您需要提取信息(展平) - 例如,Destination.DestinationName

public JsonResult getJson()
{
    return this.Json(
         new {
              Result = (from obj in db.Product select new {Id = obj.Id, Name = obj.Name, obj.Category.Description})
              }
              , JsonRequestBehavior.AllowGet
              );
}

去看看类别的导航属性...当你可能真的打算使用obj.Category.Description或类似的东西时(例如,obj.Destination),你可能会有类似于obj.Category的东西。 .DestinationName)...导航属性通常再次引用回父母。 JSON序列化程序不能很好地理解那些&#34;循环&#34;引用。

;-)我有一段时间没有同样的问题,当我意识到自己做了什么时,我在桌子上敲了敲头。