2012-01-27 41 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 />");