2013-04-09 2 views
0

첫 번째 게시물 ... 일반적으로 내 문제에 대한 답변을 검색하고 찾을 수 있지만 이번에는 수행 할 수 없습니다. 나는 다른 개체의 무리 사용하는 목적이 : 나는 서비스에서 내 생성자를 호출.getJson 호출이 상속을 사용하는 객체와 함께 작동하지 않습니다.

[DataContract] 
public class CoolStuff 
{ 
    [DataMember] 
    public Field[] CoolField { get; set; } 

    public CoolStuff() 
    { 
     CoolField = SetCoolField(); 
    } 

    private Field[] SetCoolField() 
    { 
     return new Field[] 
     { 
      new Field("Project Information", "ProjectInformation"), 
      new Field("Resource Information", "ResourceInformation"), 
     } 
    } 
} 

[DataContract] 
public class Field 
{ 
    [DataMember] 
    public string Prompt { get; set; } 
    [DataMember] 
    public string Value { get; set; } 
    [DataMember] 
    public bool IsLocked { get; set; } 

    public Field(string prompt, string value = "n/a", bool isLocked = false) 
    { 
     Prompt = prompt; 
     Value = value; 
     IsLocked = isLocked; 
    } 
} 

을, 나는 ($ .getJSON으로 /Service.svc/coolstuff를 직렬화 할 때이 벌금과 멋쟁이 작동/'+ id, loadCoolStuff);

문제는 Field 클래스가 다른 클래스에서 상속 받으면 실제로 .getJson 호출이 실패 이유를주지 않고 실패한다는 것입니다.

[DataContract] 
public class CoolStuff 
{ 
    [DataMember] 
    public FieldBase[] CoolField { get; set; } 

    public CoolStuff() 
    { 
     CoolField = SetCoolField(); 
    } 

    private FieldBase[] SetCoolField() 
    { 
     return new FieldBase[] 
     { 
      new Field("Project Information", "ProjectInformation"), 
      new Field("Resource Information", "ResourceInformation"), 
     } 
    } 
} 

[DataContract] 
public class FieldBase 
{ 

} 

[DataContract] 
public class Field : FieldBase 
{ 
    [DataMember] 
    public string Prompt { get; set; } 
    [DataMember] 
    public string Value { get; set; } 
    [DataMember] 
    public bool IsLocked { get; set; } 

    public Field(string prompt, string value = "n/a", bool isLocked = false) 
    { 
     Prompt = prompt; 
     Value = value; 
     IsLocked = isLocked; 
    } 
} 

누군가이 코드를 사용하여 왜 .getJSON에 대한 호출에 실패했는지 설명해주십시오. 나는 정말로 여기에서 붙어있다. 정말 고마워!

+0

어떤 json-serializer를 사용하고 있습니까? ASP.NET MVC의 기본값은 무엇입니까? ASP.NET WebApi 기본값은 무엇입니까? 뉴튼 소프트? – Alxandr

+0

죄송합니다, asp.net default one을 사용하고 있습니다. 필자는 직렬화에 대해 전혀 압니다. 나는이 프로젝트를 다른 사람으로부터 물려받습니다. – shawnperolis

+0

전송중인 데이터를 살펴 봐야합니다. 브라우저를'/Service.svc/coolstuff/ '+ id' 주소로 이동하여 얻은 것을보십시오. – Alxandr

답변

0

좋아,이 웹 서비스에 WCF를 사용하고 있다고 결론 내린 선들 사이를 읽으십시오. .svc로 끝나는 URL과 DataContract 속성을 사용하면 충분히 명확 해집니다. 이 문제는 WCF가 직렬화하는 방식과 관련이 있기 때문에 관련이 있습니다. 위의 설명에서 언급 한 것처럼 동일한 클래스 구조는 기본 Newtonsoft JSON serializer를 사용하는 ASP.NET 웹 API에서 문제가 있습니다.

여기서 필요한 것은 KnownType 속성으로 직렬화에 대해 파생 된 유형을 올바르게 정의 할 수 있습니다.

This article은 몇 가지 간단한 예를 제공합니다. This one에는 개념에 대해 좀 더 자세히 설명되어 있습니다. 당신이 제공 한 예를 들어

,이 같은 FieldBase 정의를 장식해야 할 것 :이 "__type":"Field:#MyTestWebProject"처럼, 당신의 JSON에 추가 필드를 추가합니다

[DataContract] 
[KnownType(typeof(Field))] 
public class FieldBase 
{ 
} 

하는 것으로. 당신은 그것을 무시하거나, 당신을 괴롭히는 경우에 그것을 제거하는 방법에 대한 사냥을 갈 수 있습니다. 나는 그것이 가능하다는 것을 보장하지 않을 것이다.

+0

정말 고마워요. – shawnperolis

관련 문제