WCF响应为ASP.NET WebForms中的Json,使用Json.NET



我使用的是WCF服务,我希望在其中使用对象列表进行响应。由于我的对象是由实体框架生成的,所以我不能真正返回List,因为它有一些循环引用,默认序列化失败。因此,我使用匿名类型来创建一个只包含我需要的属性的对象列表。这就是我正在做的,使用Json.NET:

[OperationContract]
        public string DoWork()
        {
            using (X ent = new X())
            {
                var modules = from p in ent.Modules select new { Name = p.Name, Value = p.ID };
                return JsonConvert.SerializeObject(modules);
            } 
        }

现在这是我的javascript,它在表中呈现结果:

function btn_onclick() {
            var srv = new DDSProjectManagement.ProjectsService();
            srv.DoWork(Res, null, null);
        }
        function Res(dataList) {
            var divObj = document.getElementById('tablePos');
            var name = 'Name';
            var desc = 'Description';
            var tableStart = '<table><tbody><tr><th>Name</th><th>Description</th></tr>';
            var tableContent = '';
            var tableEnd = '</tbody></table>';
            for (var i = 0; i < dataList.length; i++) {
                tableContent += '<tr><td>' + dataList[i].Name + '</td><td>' + dataList[i].Value + '</td></tr>';
            }
            divObj.innerHTML = tableStart + tableContent + tableEnd;
        }

如果我这样做,javascript得到的参数只是一个字符串,它无法将其视为我的对象列表。当然,它应该是一个Json字符串,我可以尝试解析它,使它从中提取对象。但我真的想像现在这样使用javascript并修改服务。例如,按照以下方式更改我的服务会很好:

public List<SimpleObject> DoWork()
        {                
            return new List<SimpleObject>() { new SimpleObject("Florin", 1), new SimpleObject("Andrei", 2) };
        }

SimpleObject不是EntityFramework对象,因此这没有问题。我想默认的序列化程序是Json,javascript应该得到基本相同的参数:Json字符串。

所以我的问题是,当通过Json.NET构建字符串不起作用时,如何让我的方法向JS发送匿名类型对象列表?提前谢谢。

查看SignalR。。。它将允许您从服务器端向JavaScript推送信息。我做了类似的事情,在我的ASP.NET MVC3页面上有一个WCF服务,然后每当我的服务接收到数据时,我就把它推送到我的JavaScript中。

我的服务发送信息到我的SignalR"调解员":

public void Message(string messagePacket)
    {
        new NotificationMediator().NotifyClients(messagePacket);
    }

在我的情况下,我只是新建了一个新的中介(SignalR Hub),然后在它上调用一个方法。这是我的SignalR处理程序(NotifyClients):

public void NotifyClients(string message)
    {
        Hub.GetClients<NotificationMediator>().Log(message);
    }

现在,Log是我UI上的一个JavaScript方法。以下是我处理此问题的JavaScript代码:

mediator.Log = function (message) {
        var msg = $.parseJSON(message);
        $("#logContainer").append(msg.Data + "<br />");

这对我来说终于奏效了。方法的返回类型是Stream,下面是它的工作原理:

    public Stream GetModules()
            {
                using (PMEntity ent = new PMEntity())
                {                
                    List<Module> ret = new List<Module>();
                    ret = ent.Modules.Include("Project").ToList();
                    return new MemoryStream(
                            Encoding.UTF8.GetBytes(
                            JsonConvert.SerializeObject(
                            ret.Select(e => new { Name = e.Name, Value = e.ID }))));
                }
            }

相关内容

  • 没有找到相关文章

最新更新