我有LoginModels
:
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调用发送的参数。
任何帮助表示赞赏!
答案 0 :(得分: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";
}
}
答案 1 :(得分:1)
使用JsonConstructor属性,以便您的JsonConvert知道要使用哪个构造函数:
using using Newtonsoft.Json;;
public class LoginModels
{
[JsonConstructor]
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";
}
}
以下是来源:https://www.newtonsoft.com/json/help/html/JsonConstructorAttribute.htm