[Required(ErrorMessage = "账号不能为空!")]
public string Account { get; set; }
/// <summary>
/// 密码
/// </summary>
[Required(ErrorMessage = "密码不能为空!")]
public string Password { get; set; }
public LoginModel(string username, string password)
{
Account = username;
Password = password;
}
public string Login([FromBody] LoginModel login)
{
return "{"code":20000,"data":{"token":"jack-token"}}";
}
为什么无法调用Login方法呢?LoginModel方法中的username改为account才能正常调用,这是因为构造函数的参数名和字段必须一致吗
是的,这是因为 C# 是一种大小写敏感的语言。在 LoginModel 类中,属性 Account 和 Password 都是大写开头,而在构造函数中,参数 username 和 password 都是小写开头。这导致在实例化 LoginModel 对象时,参数值无法正确地传递到对应的属性中。
因此,如果您想要正确地实例化 LoginModel 对象并调用 Login 方法,您需要将构造函数的参数名改为与属性一致,即 Account 和 Password。或者,您可以通过在参数前添加 [JsonProperty(PropertyName = "account")] 和 [JsonProperty(PropertyName = "password")] 特性来指定 JSON 属性名,从而使参数与属性正确地匹配。例如:
csharp
public LoginModel([JsonProperty(PropertyName = "account")] string account, [JsonProperty(PropertyName = "password")] string password)
{
Account = account;
Password = password;
}
这样,无论您使用什么大小写形式的参数名,都可以正确地实例化 LoginModel 对象并调用 Login 方法。
public string Login([FromBody] LoginModel login)
这个方法参数 login 没有用到你定义的构造函数,用的是默认无参构造函数
我传入的是:{"username":"jack","password":"123456"},为什么没有调用我定义的构造函数?
@天亦玄: new LoginModel("jack", "123456")
才会调用你定义的构造函数
@天亦玄: 因为默认的DefaultModelBinder创建Model的时候使用的是Activator.CreateInstance(typeToCreate);
https://github.com/mono/aspnetwebstack/blob/master/src/System.Web.Mvc/DefaultModelBinder.cs
试了下,如果是用的System.Text.Json,有参构造函数的参数名和字段名是要一致
https://learn.microsoft.com/zh-cn/dotnet/standard/serialization/system-text-json/immutability?pivots=dotnet-7-0#immutable-types-and-records
参数化构造函数的参数名称必须与属性名称和类型匹配。 匹配不区分大小写,即使使用 [JsonPropertyName] 重命名属性,构造函数参数也必须与实际属性名称匹配。