2012-01-27 2 views
0

나는 객체 목록으로 응답하고자하는 WCF 서비스를 사용하고 있습니다. 엔티티 프레임 워크에서 내 객체를 생성하므로 일부 순환 참조가 있고 기본 직렬화가 실패하므로 실제로 List를 반환 할 수 없습니다. 따라서 익명 형식을 사용하여 필요한 속성 만 포함하는 개체 목록을 만듭니다. 내가 이렇게하면Json.NET을 사용하여 ASP.NET WebForms에서 Json으로 WCF 응답

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; 
     } 

이 매개 변수 가져 자바 스크립트 :

[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); 
      } 
     } 

이제이 테이블 안에 결과를 렌더링 내 자바 스크립트입니다 : 이것은 내가 사용하고있어 Json.NET은 무엇인가 그냥 문자열이며 그것은 내 개체의 목록으로 볼 수 없습니다. 물론, 그것은 Json 문자열이어야하며 객체를 추출 할 수 있도록 파싱을 시도 할 수 있습니다. 하지만 지금은 자바 스크립트를 사용하고 서비스를 수정하고 싶습니다. 예를 들어, 다음 내 서비스를 변경하면 잘 작동합니다 :이 문제가 없습니다 있도록

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

SimpleObject는 EntityFramework의 개체가 아닙니다. 기본 serializer가 Json이고 Javascript가 기본적으로 동일한 매개 변수를 가져야한다고 가정합니다. Json 문자열입니다.

내 질문은 내 JS 메서드를 사용하여 문자열을 건물로 익명 형식 개체의 JS 내 목록을 보내려면 어떻게합니까 작동하지 않았다? 미리 감사드립니다.

+0

JSON을 JavaScript에서 파싱해야합니다. 다른 방법으로는 할 수 없습니다. (XML과 같이 다른 형식으로 직렬화 할 수는 있지만 근본적으로 같은 문제 일 것입니다.) – Pointy

답변

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 '중재자'로 정보를 전송 내 서비스 : 내 경우 I가 단지 새로운 새로운 중재자 (SignalR 허브) 다음 그것에 메소드를 호출에

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

. 다음은이 (NotifyClients)에 대한 내 SignalR 핸들러입니다.

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 />"); 
관련 문제