当我们创建接受用户数据的应用程序时,我们必须先验证该数据,然后再将其存储在数据库中。 .Net Framework不仅提供验证属性以简化对所需输入,数据类型,值范围和模式(例如电子邮件地址和信用卡号)的检查,而且ASP.Net Core可以自动检查提交HTML表单值中的验证错误。
ASP.Net Core中的模型状态是名称-值对以及验证信息的集合,这些信息在POST请求期间发送到服务器。 验证信息中包含的任何错误消息都是模型验证错误。 ASP.Net Core 2.1中引入的ApiController属性自动处理模型状态验证。 如果模型状态无效,则返回适当的错误。
本文讨论了如何在ASP.Net Core中使用此新功能。
在Visual Studio中创建一个ASP.Net Core应用程序
在本节中,我们将创建ASP.Net Core应用程序,用于学习如何使用ApiController属性。 请按照下面概述的步骤在Visual Studio 2017中创建一个新的ASP.Net Core项目。
- 启动Visual Studio 2017 IDE。
- 单击文件>新建>项目。
- 选择“ ASP.Net Core Web应用程序”项目模板。
- 指定项目的名称和位置。
- 单击确定。
- 在“新建ASP.Net Core Web应用程序”对话框窗口中,选择.Net Core。
- 选择ASP.Net Core 2.1作为项目的版本。
- 选择“ Web API”作为项目模板。
- 取消选中“启用Docker支持”和“配置HTTPS”复选框,因为这里我们不需要这些功能。
- 确保显示消息“无身份验证”; 我们也不需要身份验证。
- 单击确定。
在将ApiController属性用于ASP.Net Core 2.1中的自动模型状态验证之前,让我们研究一下如何在ASP.Net Core 2.0中自动进行模型状态验证。
在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中使用自动模型状态验证
在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<string> 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中禁用自动模型状态验证
请注意,您可以在ASP.Net Core 2.1中禁用自动模型验证。 为此,您需要在ConfigureServices方法中将ApiBehaviorOptions类的SuppressModelStateInvalidFilter属性设置为true,如下所示。
public void ConfigureServices(IServiceCollection services)
{
services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressModelStateInvalidFilter = true;
});
}
自动模型状态验证可节省工作。 当模型验证在ConfigureServices方法中全局应用时,可以避免在操作方法中编写重复的代码。 您在操作方法中所需要做的就是检查模型状态是否无效并正确返回错误消息。
if (!ModelState.IsValid)
{
// Write code to return bad request or errors or redirect elsewhere
}
应用程序应始终先验证数据,然后再将其存储在数据库中。 在验证数据时,应用程序应检查数据是否安全并符合您的预定义规则。 此过程也称为模型验证。 尽管ASP.Net Core 2.1使您能够自动执行模型验证,但有时您可能希望禁用自动模型状态验证并以编程方式(即仅在需要时)验证模型。
翻译自: https://www.infoworld.com/article/3318117/how-to-automate-model-validation-in-aspnet-core.html