如何在 ASP.Net Core中 自动进行模型验证?

当我们创建接受用户数据的应用程序时,必须先验证该数据,然后再将其存储在数据库中。 .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项目。

  1. 启动Visual Studio 2017 IDE。
  2. 单击文件>新建>项目。
  3. 选择“ ASP.Net Core Web应用程序”项目模板。
  4. 指定项目的名称和位置。
  5. 单击确定。
  6. 在“新建ASP.Net Core Web应用程序”对话框窗口中,选择.Net Core。
  7. 选择ASP.Net Core 2.1作为项目​​的版本。
  8. 选择“ Web API”作为项目模板。
  9. 取消选中“启用Docker支持”和“配置HTTPS”复选框,因为这里我们不需要这些功能。
  10. 确保显示消息“无身份验证”; 我们也不需要身份验证。
  11. 单击确定。

在利用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 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(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

你可能感兴趣的:(如何在 ASP.Net Core中 自动进行模型验证?)