无法将数据从Action Controller发送到AJAX Caller,对动态代理属性的上下文模型进行序列化。
无法将数据从Action Controller发送到AJAX Caller,对动态代理属性的上下文模型进行序列化。
我试图将从上下文中收集到的查询数据发送回给ajax调用者,并且返回以下状态:
1-源代码服务器端成功查询数据。
2-源代码服务器端成功发送数据,如果使用HTTPPOST或HTTPGET。
3-源代码没有异常或错误。
4-应用JSON(查询对象)方法没有改变。
情景如下:
使用以下ajax调用:
$.ajax({ type: "POST", url: '@Url.Action("MainCatItems", "Cachier")', contentType: "application/json; charset=utf-8", data: datas, dataType: "json", success: successFunc, error: function (xhr) { alert('错误:' + xhr.statusText); }, });
调用一个Action Controller
[HttpPost] public ActionResult MainCatItems(int mainCatNo) { var results = ......//从上下文中获取数据 return Json(new { data = results }, JsonRequestBehavior.AllowGet); }
这个调用成功地将我的参数发送到action,但是从控制器返回响应到ajax调用有点混乱,因为我有两种情况:
第一种:(完美地工作)
我返回从实体框架中的表类(RegisterNotification类)查询的数据
public partial class RegisterNotification { //设置器和获取器 }
这是一个没有声明导航属性的单个类。
第二种(问题所在)
我返回从实体框架中的表类(Item类"partial类")查询的数据
第一部分:
public *partial* class Item { // 设置器和获取器 }
第二部分:
public *partial* class Item { //设置器和获取器 }
这是一个有声明导航属性的partial类。
这种情况不起作用,当返回到ajax调用时,它会弹出错误函数消息,显示"内部服务器错误500"。
我尝试在控制器中将查询的数据解析为JSON对象:
var t = Json(res,"application/json; charset=utf-8",JsonRequestBehavior.AllowGet);
但是再次失败。
感谢您的关注。
问题的原因是在Action Controller中无法将数据发送到AJAX Caller。解决方法是对动态代理属性的上下文模型进行序列化。
在上述代码中,GetCatItems方法从Context中获取数据,并将数据以JSON格式返回给调用者。调用者使用AJAX调用来访问该方法,并将结果显示在页面上。
然而,这段代码中存在一个问题。在AJAX调用中,我们使用了ActionResult来返回数据,这要求客户端将返回的数据转换为所需的JSON对象。但是,在这种情况下,我们已经在Action Controller中将数据转换为JSON对象,因此出现了代理使用的问题。
为了解决这个问题,我们需要对动态代理属性的上下文模型进行序列化。这样,就可以正确地将数据发送给AJAX调用。
具体的解决方法可以参考以下链接:link。
问题的原因是使用了Entity Framework生成的代理对象,导致在序列化过程中出现问题。解决方法是将ProxyCreationEnabled属性设置为false,禁用代理对象的创建。具体代码如下:
[HttpPost] public ActionResult MainCatItems(int mainCatNo) { entity.Configuration.ProxyCreationEnabled = false; var results = _model.Item.Where(x => x.MenuCategoryID == mainCatNo).ToList(); return Json(new { data = results }, JsonRequestBehavior.AllowGet); }
ProxyCreationEnabled属性与动态类型有关,对于严格的序列化/反序列化,客户端需要知道类型信息以重新创建数据。但是对于JSON来说,这种要求是奇怪的。从技术上讲,JSON可以处理任何类型的对象,它的接口是与平台无关的。一旦被序列化,就不再需要知道源类型了。客户端自己决定如何反序列化数据。看起来这是一种必须遵循的严格设计。