我正在尝试调用getData web方法,该方法将返回包含cityID,country,city的Destination表记录列表(我正在使用ADO.NET Entity Framework Model),但我收到500内部服务器错误。 如果我创建一个新的Destination对象并将其添加到新列表,则没有错误。该怎么办请帮帮我,我是新手。
无法加载资源:服务器响应状态为500(内部服务器错误)
响应文本:“{”消息“:”在序列化类型为\ u0027System.Data.Entity.DynamicProxies.Dest ......}的对象时检测到循环引用“
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);
}
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();
}
}
<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>
答案 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;引用。
;-)我有一段时间没有同样的问题,当我意识到自己做了什么时,我在桌子上敲了敲头。