验证数据注释时未进入Controller

时间:2018-09-27 10:53:32

标签: c# asp.net-core asp.net-core-webapi

我正在使用ASP.NET Core宁静的Web API。我的问题是我在控制器内部进行了服务器验证,以检查视图模型(Contact.cs)验证。

但是,当我在控制器中测试POST动作CreateContact时,永远不会输入该动作,但是会根据我在Contact.cs类中包含的数据注释正确地对其进行验证。

我不明白为什么进入控制器之前会进行验证。我认为,在Web API中,将根据ControllerModelState中检查服务器验证。然后我的ModelState.IsValid支票似乎没用。

我的视图模型:

public class Contact
{
    [Required]
    public int? Id { get; set; }
    [MaxLength(20)]
    public string FirstName { get; set; }
    // ...
}

我的控制器动作片段,从未输入。

[Route("api/[controller]")]
[ApiController]
public class ContactsController : ControllerBase
{
    [HttpPost]
    public IActionResult CreateContact(ViewModels.Contacts.Contact contact)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        // ...
    }
 }

1 个答案:

答案 0 :(得分:3)

您应用于控制器的ApiController attribute具有某些约定。其中之一是,传递的模型在进入控制器操作之前会被自动验证

因此,这有效地消除了检查每种方法中的ModelState.IsValid的需要。

您可以了解有关ApiController属性in the official documentationin this blog post的更多信息,它们还涵盖了该属性包括的其他约定。

如果您不希望这种行为,并且仍然希望能够在控制器操作中手动执行此操作,请查看this question on disabling the functionality