2012-01-27 17 views
0

我正在使用WCF服务,我想用对象列表做出响应。由于我的对象是由实体框架生成的,因此我无法真正返回List,因为它有一些循环引用,并且默认序列化失败。因此,我使用匿名类型来创建一个只包含我需要的属性的对象列表。 这是我在做什么,使用Json.NET:作为Json的WCF响应在ASP.NET WebForms,使用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字符串。

所以我的问题是我如何让我的方法发送一个匿名类型对象列表给我的JS,因为通过Json.NET构建字符串不起作用? 在此先感谢。

+0

您必须发送一个字符串,然后从JavaScript解析JSON。没有其他办法可以做到这一点。 (好吧,你可以用不同的格式序列化,就像XML一样,但它本质上是一样的问题。) – Pointy 2012-01-27 14:51:33

回答

0

这终于为我工作。该方法的返回类型是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 })))); 
       } 
      } 
0

调查SignalR ...它可以让你从你的服务器端推送信息到你的JavaScript。我在我的ASP.NET MVC3页面上有一个类似的WCF服务,然后当我的服务接收到数据时,我只是将它推送到我的JavaScript。

我的服务发送信息到我的SignalR“调停”:

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

在我来说,我只是新了一个新的调解员(SignalR集线器),然后调用一个方法就可以了。这是我的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 />");