当我们创建接受用户数据的应用程序时,必须先验证该数据,然后再将其存储在数据库中。 .Net Framework不仅提供验证属性以简化对所需输入,数据类型,值范围和模式(例如电子邮件地址和信用卡号)的检查,而且ASP.Net Core可以自动检查提交的HTML表单值中的验证错误。
ASP.Net Core中的模型状态是名称-值对以及验证信息的集合,这些信息在POST请求期间发送到服务器。 验证信息中包含的任何错误消息都是模型验证错误。 ASP.Net Core 2.1中引入的ApiController属性自动处理模型状态验证。 如果模型状态无效,则返回适当的错误。
本文讨论了如何在ASP.Net Core中使用此新功能。
在本节中,我们将创建ASP.Net Core应用程序,用于学习如何使用ApiController属性。 请按照下面概述的步骤在Visual Studio 2017中创建一个新的ASP.Net Core项目。
在利用ApiController属性在ASP.Net Core 2.1中进行自动模型状态验证之前,让我们研究一下如何在ASP.Net Core 2.0中自动进行模型状态验证。
要在ASP.Net Core 2.0中自动进行模型状态验证,我们可以利用自定义操作过滤器,如下面的代码片段所示。 在模型绑定之前以及在执行动作之前和之后执行动作过滤器。 要创建自定义动作过滤器,您需要扩展ActionFilterAttribute类。 应当注意,此类是IActionFilter,IAsyncActionFilter,IResultFilter,IAsyncResultFilter和IOrderedFilter接口的实现。
public class AutomaticModelStateValidatorAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext actionExecutingContext)
{
if (!actionExecutingContext.ModelState.IsValid)
{
actionExecutingContext.Result = new BadRequestObjectResult(actionExecutingContext.ModelState);
}
}
}
接下来,您可以编写必要的代码,以在Startup.cs文件的ConfigureServices方法中的管道中添加自定义操作过滤器,如下所示。 AutomaticModelStateValidatorAttribute是我们之前实现的自定义操作过滤器类的名称。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.Filters.Add(typeof(AutomaticModelStateValidatorAttribute));
});
}
这就是您要做的全部。 但是,使用ASP.Net Core 2.1,工作就更简单了。
在ASP.Net Core 2.1中,ApiController属性将触发自动模型验证,而无需编写任何自定义代码。 以下代码段显示了在Visual Studio中创建项目时在ASP.Net Core 2.1中使用ApiController属性应用的默认ValuesController。
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
//The controller methods have been removed for clarity
}
接下来,我们需要一个模型进行验证。 创建一个名为Author的模型类,如下面的代码片段所示。 请注意[Required]和[StringLength]验证属性的用法。 若要使用这些属性,应包括System.ComponentModel.DataAnnotations命名空间。
using System.ComponentModel.DataAnnotations;
public class Author
{
[Required]
[StringLength(4)]
public string Code { get; set; }
[Required]
[StringLength(50)]
public string FirstName { get; set; }
[Required]
[StringLength(50)]
public string LastName { get; set; }
}
现在,我们将研究如何在控制器方法中使用此模型类并应用模型验证。
创建一个名为AuthorController的新控制器。 乍一看,AuthorController将如下所示:
[Route("api/[controller]")]
[ApiController]
public class AuthorController : ControllerBase
{
[HttpGet]
public IEnumerable Get()
{
return new string[] { "value1", "value2" };
}
[HttpGet("{id}", Name = "Get")]
public string Get(int id)
{
return "value";
}
[HttpPost]
public void Post([FromBody] string value)
{
}
[HttpPut("{id}")]
public void Put(int id, [FromBody] string value)
{
}
[HttpDelete("{id}")]
public void Delete(int id)
{
}
}
现在,用下面给出的方法替换默认的Post方法。
[HttpPost]
public IActionResult Post([FromBody]Author author)
{
if (ModelState.IsValid)
{
return Ok();
}
else
{
return BadRequest();
}
}
就是这样! 您可以通过对AuthorController进行POST调用来测试模型验证的工作方式。 我将把它留给您来实施。
请注意,您可以在ASP.Net Core 2.1中禁用自动模型验证。 为此,您需要在ConfigureServices方法中将ApiBehaviorOptions类的SuppressModelStateInvalidFilter属性设置为true,如下所示。
public void ConfigureServices(IServiceCollection services)
{
services.Configure(options =>
{
options.SuppressModelStateInvalidFilter = true;
});
}
自动模型状态验证节省了工作。 在ConfigureServices方法中全局应用模型验证时,可以避免在操作方法中编写重复代码。 您在操作方法中所需要做的就是检查模型状态是否无效,并适当地返回错误消息。
if (!ModelState.IsValid)
{
// Write code to return bad request or errors or redirect elsewhere
}
应用程序应始终先验证数据,然后再将其存储在数据库中。 在验证数据时,应用程序应检查数据是否安全并符合您的预定义规则。 此过程也称为模型验证。 尽管ASP.Net Core 2.1使您能够自动执行模型验证,但有时您可能希望禁用自动模型状态验证并以编程方式(即仅在需要时)验证模型。
From: https://www.infoworld.com/article/3318117/how-to-automate-model-validation-in-aspnet-core.html