2016-04-24 8 views
1

Я работаю над последовательным ответом веб-API. Я оберточной желаемый объект/субъект в ApiResponsDTO отправленном с помощью метода API действий контроллераDeserialize Generic <T>

public IHttpActionResult Validate([FromBody] PortalLoginDTO logindDTO) 
{ 
    IHttpActionResult response = null; 
    ApiResponseDTO<AppUserDTO> responseData = null; 

    var user = _userservice.GetUserByName(logindDTO.Username); 
    responseData = new ApiResponseDTO<AppUserDTO>(user, 200); 
    response = new ApiResponseActionResult<ApiResponseDTO<AppUserDTO>>(responseData, 200); 

    return response; 
} 

Response Класс в API

public class ApiResponseDTO<T> 
{ 
    private T _value; 

    [DataMember] 
    public string Version { private set { } get { return "1.2.3"; ; } } 

    [DataMember] 
    public double StatusCode { get; set; } 

    [DataMember] 
    public List<string> ErrorMessages { get; set; } 

    [DataMember] 
    public T Result { private set { } get { return _value; } } 
    public ApiResponseDTO() 
    { 
     ErrorMessages = new List<string>(); 
    } 
    public ApiResponseDTO(T value, double statusCode) 
    { 
     StatusCode = (int)statusCode; 
     _value = value; 
     ErrorMessages = new List<string>(); 
    } 
} 

В результате поля выше класса я хочу послать еще запрашиваемый объект/класс

запрошенный класс

[DataContract] 
public partial class AppUserDTO 
{ 
    public AppUserDTO() 
    { 

    } 
    [DataMember] 
    public int UserId { get; set; } 
    [DataMember] 
    public string Username { get; set; } 
    [DataMember] 
    public Nullable<int> TitleId { get; set; } 
    [DataMember] 
    public string FirstName { get; set; } 
    [DataMember] 
    public string Surname { get; set; } 
    [DataMember] 
    public bool IsActive { get; set; } 
    [DataMember] 
    public string PasswordEncoded { get; set; } 

} 

На клиенте MVC приложения Я использую JavaScriptSerializer

var responsedatda = serializer.Deserialize<ApiResponseDTO<AppUserDTO>>(response.Content.ReadAsStringAsync().Result); 

Я получаю ApiResponseDTO но запрашиваемый класс не сериализации, как показано на рисунке Response in client side

, что является причиной того, что я не получаю вложенные UserDTO в ответе API.

ответ

1

сериализатор должен быть в состоянии установить основную ценность результата, но ваш код ...

public T Result { private set { } get { return _value; } } 

... не допускает, что в сериализаторе создает класс, используя конструктор по умолчанию.

Вы должны обновить Result свойства ...

public T Result { 
    get { return _value; } 
    set { _value = value; } 
} 

ИЛИ вы можете реорганизовать класс ...

public class ApiResponseDTO<T> { 

    [DataMember] 
    public string Version { get { return "1.2.3"; } } 

    [DataMember] 
    public double StatusCode { get; set; } 

    [DataMember] 
    public List<string> ErrorMessages { get; set; } 

    [DataMember] 
    public T Result { get; set; } 

    public ApiResponseDTO() 
    { 
     ErrorMessages = new List<string>(); 
    } 

    public ApiResponseDTO(T value, double statusCode) 
    { 
     StatusCode = (int)statusCode; 
     Result = value; 
     ErrorMessages = new List<string>(); 
    } 
} 
Смежные вопросы