无法将数据从Action Controller发送到AJAX Caller,对动态代理属性的上下文模型进行序列化。

20 浏览
0 Comments

无法将数据从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);

源代码服务器端查询的数据

客户端错误消息详情

但是再次失败。

感谢您的关注。

0
0 Comments

问题的原因是在Action Controller中无法将数据发送到AJAX Caller。解决方法是对动态代理属性的上下文模型进行序列化。

在上述代码中,GetCatItems方法从Context中获取数据,并将数据以JSON格式返回给调用者。调用者使用AJAX调用来访问该方法,并将结果显示在页面上。

然而,这段代码中存在一个问题。在AJAX调用中,我们使用了ActionResult来返回数据,这要求客户端将返回的数据转换为所需的JSON对象。但是,在这种情况下,我们已经在Action Controller中将数据转换为JSON对象,因此出现了代理使用的问题。

为了解决这个问题,我们需要对动态代理属性的上下文模型进行序列化。这样,就可以正确地将数据发送给AJAX调用。

具体的解决方法可以参考以下链接:link

0
0 Comments

问题的原因是使用了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可以处理任何类型的对象,它的接口是与平台无关的。一旦被序列化,就不再需要知道源类型了。客户端自己决定如何反序列化数据。看起来这是一种必须遵循的严格设计。

0