我正在开展一项测试ASP.NET Core 2.0
服务,以扩展我的编程知识,以包括服务器端体验。我有一个注册模型类,当用户在我的应用程序中注册时,该类被发送到服务。我的RegistrationModel
课程如下:
public class RegistrationModel
{
[Required]
public string Username { get; set; }
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
[Required]
[EmailAddress]
public string Email { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
public string Password { get; set; }
[Required]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
我调用的RegisterUser
方法如下。我正在将数据发布到服务并从呼叫的Body
检索它。
[HttpPost(nameof(RegisterUser))]
[AllowAnonymous]
public async Task<IActionResult> RegisterUser([FromBody] RegistrationModel registrationInfo)
将JSON发送到服务时,除非我发送空对象,否则ModelState.IsValid 始终为true。如果我发送一个完全空的对象,ModelState.IsValid仍然是 true 。我还尝试从方法的参数列表中删除[FromBody]
,但没有改变任何内容。
是否需要在startup.cs文件中设置一些选项以自动验证模型,还是需要我自己执行手动验证?如果我需要提供任何其他信息,请告诉我。
答案 0 :(得分:0)
模型验证开箱即用。
我基于Visual Studio提供的ASP.NET Core 2.0模板创建了一个新项目,它运行良好。
以下是该行动的实施:
public Task<IActionResult> Register([FromBody] RegistrationModel model)
{
return Task.FromResult<IActionResult>(Ok(new { ModelState.IsValid, ModelState.Values }));
}
发送以下JSON:
{
"Username": "Mick",
"FirstName": "Mick",
"LastName": "Mick",
"Email": "mick@mick.com",
"Password": "MickMick",
"ConfirmPassword": "MickMick"
}
制备:
{
"isValid": true,
"values": []
}
但是,发送以下有效负载:
{
"Username": "Mick",
"FirstName": "",
"LastName": "Mick",
"Email": "",
"Password": "MickMick",
"ConfirmPassword": ""
}
产生了以下回应:
{
"isValid": false,
// some properties omitted for brevity
"values": [
{
"key": "Email",
"errors": [
{
"errorMessage": "The Email field is required."
}
]
},
{
"key": "FirstName",
"errors": [
{
"errorMessage": "The FirstName field is required."
}
]
},
{
"key": "ConfirmPassword",
"errors": [
{
"errorMessage": "The ConfirmPassword field is required."
},
{
"errorMessage": "The password and confirmation password do not match."
}
]
}
]
}
您能描述一下如何点击端点以及您在请求中发送的确切负载吗?
答案 1 :(得分:0)
在我的服务中,我打电话给services.AddMvcCore()
而非services.AddMvc()
,因为这严格来说是Api,并且不会有面向网络的视图。
使用services.AddMvcCore()
时,您必须指定services.AddMvc()
默认提供的许多功能。我没有指定的一个功能是.AddDataAnnotations()
。将其添加到我现有的services.AddMvcCore().AddJsonFormatters().AddAuthorization=(...)
调用中修复了所有内容。