2016-05-20 11 views
0

Ich habe ein seltsames Problem in ASP.NET Web API. Ich habe eine generische Klasse erstellt, um das zurückgegebene Modell für alle Webmethoden zu sein. Dies ist der Code des Modells: -Web-API - Fehler bei der Stichprobengenerierung

public class RequestResponse<T> 
{ 
    public bool Sucess { get; set; } 
    public string Message { get; set; } 
    public T ReturnedData { get; set; } 
    public List<T> ReturnedDataList { get; set; } 
} 

Jedes Mal, wenn ich es in HTTP-Methode wie folgt Versuchen Sie es mit:

public RequestResponse<BillsModel> CreateBill([FromBody] BillsModel billToAdd, MainHelpers.UserType userType) 

Dies ist BillsModel Klasse:

public class BillsModel 
{ 
    public Guid Id { get; set; } 
    public DateTime BillDate { get; set; } 
    public long Number { get; set; } 
    public Guid OrderId { get; set; } 
    public int OrderType { get; set; } 
    public Guid PlaceId { get; set; } 
    public double TaxPercentage { get; set; } 
    public double? DiscountPercentage { get; set; } 
    public Guid CreatedBy { get; set; } 
    public DateTime CreatedOn { get; set; } 
    public Guid? ModifiedBy { get; set; } 
    public DateTime? ModifiedOn { get; set; } 
} 

Und dann läuft die api siehe die Methoden und Verfahren der Wahl, ich sehe die folgenden:

{ 
    "Sucess" : true, 
    "Message" : "sample string 2", 
    "ReturnedData" : { 
     "$id" : "2", 
     "Id" : "14b479ec-c128-4916-8ed5-c0067c20fd9f", 
     "BillDate" : "2016-05-20T21:57:32.530957+02:00", 
     "Number" : 3, 
     "OrderId" : "dd266c00-0167-49e8-a8f0-0996aca21490", 
     "OrderType" : 5, 
     "PlaceId" : "98059b6e-acfb-4c89-8c6a-72ef30cce4d6", 
     "TaxPercentage" : 7.1, 
     "DiscountPercentage" : 1.1, 
     "CreatedBy" : "ba106082-44be-4a53-9d32-40bf4ee32bde", 
     "CreatedOn" : "2016-05-20T21:57:32.530957+02:00", 
     "ModifiedBy" : "3d164ffd-aa1c-40d4-a646-9d6ca91615db", 
     "ModifiedOn" : "2016-05-20T21:57:32.530957+02:00" 
    }, 
    "ReturnedDataList" : { 
     "$id" : "3", 
     "$values" : [{ 
       "$ref" : "2" 
      }, { 
       "$ref" : "2" 
      } 
     ] 
    } 
} 

Wie Sie sehen können, funktioniert es gut, wenn es um ein Objekt geht, aber wenn es um eine Liste geht, wird ein nicht identifiziertes Objekt "$ ref" angezeigt. Dasselbe gilt für "$ id" und "$ values".

Können Sie mir bitte dabei helfen?

+0

Was für BillsModel die Klassendefinition ist? basiert es auf dem Entity Framework? Vielleicht sind das zusätzliche Metadaten in Bezug auf EF? – dfdsfdsfsdf

+0

Nein, es ist eine benutzerdefinierte Klasse mit nur normalen Eigenschaften wie string, int, ... etc. Ich musste dies tun, da EF-Modelle ein Problem machten, als ich versuchte, sie direkt als Parameter oder als Rückgabetyp zu verwenden. –

+0

Sie sollten den JSON hier anstelle eines Screenshots kopieren/einfügen. Wie für die '$ ...' Schlüssel sind sie Referenzen. Mehr über sie [hier] (http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_PreserveReferencesHandling.htm) – Nasreddine

Antwort

0

Ich habe den folgenden Web-Service und bin mit einem generischen Typ der verpackten Daten zurückzukehren, und ich bin nicht immer, was Sie bekommen. Können Sie dies in einem separaten Projekt ausführen und sehen, welche JSON-Daten zurückgegeben werden?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Web.Http; 

public class Account 
{ 
    public int AccountID { get; set; } 

} 
public class BusinessAccount : Account 
{ 
    public string BusinessAddress { get; set; } 
} 

public class Package<T> 
{ 
    public T Data { get; set; } 
} 

/// <summary> 
/// using fiddler, I made a request to http://localhost/api/account 
/// and got 
/// 
/// {"Data":{"BusinessAddress":"ABC","AccountID":123}} 
/// 
/// without making any configuration. 
/// 
/// 
/// </summary> 
namespace test 
{ 
    public class AccountController : ApiController 
    { 
     // GET api/<controller> 
     public Package<BusinessAccount> Get() 
     { 
      return new Package<BusinessAccount>() 
      { 
       Data = new BusinessAccount() 
       { 
        AccountID = 123, 
        BusinessAddress = "ABC" 
       } 
      }; 
     } 
    } 
} 
+0

Nichts ist passiert. Das gleiche Problem ist immer noch passiert. –

1

können Sie dieses Verhalten deaktivieren, indem Sie diese am Ende Ihrer Application_Start() Methode Global.asax hinzu:

GlobalConfiguration 
    .Configuration 
    .Formatters 
    .JsonFormatter 
    .SerializerSettings 
    .PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;