ASP NET Core 2模型验证不正确

时间:2018-04-12 01:52:48

标签: c# asp.net-core-2.0 model-validation

我正在开展一项测试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文件中设置一些选项以自动验证模型,还是需要我自己执行手动验证?如果我需要提供任何其他信息,请告诉我。

2 个答案:

答案 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=(...)调用中修复了所有内容。