2015-04-04 3 views
0

У меня есть LoginModels:Вызов конструктора при десериализации JSON объекта

public class LoginModels 
{ 
    public LoginModels(string userEmail, string userPassword) 
    { 
     email = userEmail; 
     password = userPassword; 
     errorMessage = GetLoginError(); 
    } 

    public string email; 
    public string password; 
    public string errorMessage; 

    public string GetLoginError() 
    { 
     if (string.IsNullOrEmpty(email)) return "email is empty"; 
     else return "good"; 
    } 
} 

Я послал JSON к функции контроллера ..

В контроллере я написал:

LoginModels user = JsonConvert.DeserializeObject<LoginModels>(userDetails); 
string relevantEmail = user.email; 

НО, но конструктор LoginModels получает email и password как null.

Именно поэтому errorMessage является email is empty.

Но relevantEmail - это письмо, отправленное с помощью ajax (и все в порядке).

Я действительно не знаю, почему конструктор не получает параметры, которые были отправлены вызовом ajax.

Любая помощь оценена!

ответ

1

Сериализация/десериализация может вызывать только конструктор по умолчанию - представьте, что у вас будет несколько конструкторов с различными параметрами - как может фреймворк угадать, какой из них вызывать/какие параметры? Кроме того, сериализуемые поля должны быть свойствами. Таким образом, ваш объект должен выглядеть так:

public class LoginModels 
{ 
    private string _errorMessage; 

    // default ctor for serialization 
    public LoginModels() 
    { 
    } 

    public LoginModels(string userEmail, string userPassword) 
    { 
     email = userEmail; 
     password = userPassword; 
    } 

    public string email { get; set; } 
    public string password { get; set; } 
    public string errorMessage 
    { 
     get 
     { 
      if (string.IsNullOrEmpty(_errorMessage)) 
      { 
       _errorMessage = GetLoginError(); 
      } 
      return _errorMessage; 
     } 
     set { _errorMessage = value; } 
    } 

    public string GetLoginError() 
    { 
     if (string.IsNullOrEmpty(email)) 
     { 
      return "email is empty"; 
     } 
     // also no need for "else" here 
     return "good"; 
    } 
} 
Смежные вопросы