asp.net core中使用FluentValidation

FluentValidation 可以集成到asp.net core中。一旦启用,MVC会在通过模型绑定将参数传入控制器的方法上时使用FluentValidation 。

你可以通过Install-Package FluentValidation.AspNetCore来引入相应的Nuget包。

安装后,你需要在StartUp类中的ConfigureService方法中配置:

public void ConfigureServices(IServiceCollection services) {
services.AddMvc(setup => {
//...mvc setup...
}).AddFluentValidation();
}

同时,你需要在ServiceCollection中注入你的验证规则:

public void ConfigureServices(IServiceCollection services) {
services.AddMvc(setup => {
//...mvc setup...
}).AddFluentValidation(); services.AddTransient<IValidator<Person>, PersonValidator>();
//etc
}

上面那种方法一次只注入一个,你可以通过下面的方法将所有验证规则注入:

services.AddMvc()
.AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<PersonValidator>());

下面假设一个将要验证Person类的验证规则:

public class Person {
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public int Age { get; set; }
} public class PersonValidator : AbstractValidator<Person> {
public PersonValidator() {
RuleFor(x => x.Id).NotNull();
RuleFor(x => x.Name).Length(, );
RuleFor(x => x.Email).EmailAddress();
RuleFor(x => x.Age).InclusiveBetween(, );
}
}

我们可以在控制器和关联的视图中使用Person类:

public class PeopleController : Controller {
public ActionResult Create() {
return View();
} [HttpPost]
public IActionResult Create(Person person) { if(! ModelState.IsValid) { // re-render the view when validation failed.
return View("Create", person);
} Save(person); //Save the person to the database, or some other logic TempData["notice"] = "Person successfully created";
return RedirectToAction("Index"); }
}

下面是对应的视图:

@model Person

<div asp-validation-summary="ModelOnly"></div>

<form asp-action="Create">
Id: <input asp-for="Id" /> <span asp-validation-for="Id"></span>
<br />
Name: <input asp-for="Name" /> <span asp-validation-for="Name"></span>
<br />
Email: <input asp-for="Email" /> <span asp-validation-for="Email"></span>
<br />
Age: <input asp-for="Age" /> <span asp-validation-for="Age"></span> <br /><br />
<input type="submit" value="submtit" />
</form>

现在当你提交表单,模型绑定组件会使用PersonValidator,并且将验证结果放到ModelState中。

当使用这种自动集成来执行验证器时,对于高级用户来说,RootContextData包含一个名为InvokedByMvc的条目,它的值设置为true,可以在定制确认器中使用它来判断一个验证器是由MVC自动调用的,还是手动的。

和asp.net core内置的验证的兼容性

默认情况下,当FluentValidation执行完成后其它的模型验证也有机会执行。这意味着你可以将FluentValidation和asp.net core内置的验证混用。

如果你想制止这种行为,你可以这样配置:

services.AddMvc().AddFluentValidation(fv => {
fv.RunDefaultMvcValidationAfterFluentValidationExecutes = false;
});

设置RunDefaultMvcValidationAfterFluentValidationExecutes为false意味着对IValidatableObject的支持也被禁止了。

隐式的 vs显式的对属性的属性的验证

当验证一个复杂类型的对象时,你必须显式的通过SetValidator方法为属性指定一个验证程序。

当运行一个ASP.NET MVC应用程序,也可以选择性地为子属性启用隐式验证。当启用此功能时,无需使用SetValidator指定子验证器,MVC的验证基础设施将递归地尝试为每个属性自动查找验证器。这可以通过将隐式的的validatechild属性设置为true来实现:

services.AddMvc().AddFluentValidation(fv => {
fv.ImplicitlyValidateChildProperties = true;
});

需要注意的是如果你开启了这个功能,那你就不要再用SetValidator来为属性的属性指定一个验证器,否则会验证两遍。

客户端验证

FluentValidation 是一个服务端的框架。并不会提供任何客户端的验证。但是,他可以为生成的html提供元数据,这些元数据可以被前端的框架诸如jquery validation所使用。比如asp.net core的验证特性(attribute)就是这个干的。

但不是所有的内置验证规则都能被客户端使用,能够被客户端使用的如下:

  • NotNull/NotEmpty
  • Matches (regex)
  • InclusiveBetween (range)
  • CreditCard
  • Email
  • EqualTo (cross-property equality comparison)
  • MaxLength
  • MinLength
  • Length

手动验证

在一些情况下你想要手动的验证一些对象,在这种情况下,验证的结果能被放入ModelState的Dictionary里面:

public ActionResult DoSomething() {
var customer = new Customer();
var validator = new CustomerValidator();
var results = validator.Validate(customer); results.AddToModelState(ModelState, null);
return View();
}
AddToModelState是一个扩展方法需要引入FluentValidation 命名空间,第二个参数是一个可选参数,会作为属性的名称的前缀,比如AddToModelState(ModelState, “Foo”),会生成Foo.Id或Foo.Name而不是Id或Name

定制验证

使用这种自动集成的缺点是,你不能直接访问验证器,这意味着与手动运行验证器相比,你对验证过程的控制没有那么多。你可以使用CustomizeValidatorAttribute来配置验证器将如何运行。例如,如果你想让验证器只运行一个特定的规则集,那么你可以通过将将要验证的参数来指定规则集名称:

public ActionResult Save([CustomizeValidator(RuleSet="MyRuleset")] Customer cust) {
// ...
}

这和下面的代码是等价的:

var validator = new CustomerValidator();
var customer = new Customer();
var result = validator.Validate(customer, ruleSet: "MyRuleset");

这个特性也可以指定相应的属性:

public ActionResult Save([CustomizeValidator(Properties="Surname,Forename")] Customer cust) {
// ...
}

和下面的代码等价:

var validator = new CustomerValidator();
var customer = new Customer();
var result = validator.Validate(customer, properties: new[] { "Surname", "Forename" });

你还可以使用Customizeevalidatorattribute来跳过特定类型的验证。如果你需要手动验证类型(例如,如果您想执行异步验证,那么您需要手动实例化验证器,并调用ValidateAsync,因为MVC的验证管道不是异步的)。

public ActionResult Save([CustomizeValidator(Skip=true)] Customer cust) {
// ...
}

验证拦截器

你可以进一步的通过一个拦截器来定制这个过程。这个拦截器需要实现FluentValidaiton.MVC命名空间下的IValidatorInterceptor 接口。

public interface IValidatorInterceptor    {
ValidationContext BeforeMvcValidation(ControllerContext controllerContext, ValidationContext validationContext);
ValidationResult AfterMvcValidation(ControllerContext controllerContext, ValidationContext validationContext, ValidationResult result);
}

这个接口有两个方法:BeforeMvcValidation 和AfterMvcValidation。

太累了,明天继续把。。。

【翻译】asp.net core中使用FluentValidation来进行模型验证的更多相关文章

  1. 在 ASP.NET Core 中使用 FluentValidation 进行验证

    目录 从 NuGet 安装 FluentValidation 争对 Resource类 建立 FluentValidation 在Startup中对写好的验证进行注册 从 NuGet 安装 Fluen ...

  2. [06]ASP.NET Core中的进程内(InProcess)托管

    ASP.NET Core 进程内(InProcess)托管 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新版本 本文出自<从零开始学 ...

  3. ASP.NET Core WebApi基于JWT实现接口授权验证

    一.ASP.Net Core WebApi JWT课程前言 我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再 ...

  4. 【翻译】asp.net core中使用MediatR

    这篇文章来自:https://ardalis.com/using-mediatr-in-aspnet-core-apps 本文作为翻译,有一些单词翻译成中文可能会有一些误解(对于读者)或者错误(对于作 ...

  5. [翻译] 如何在 ASP.Net Core 中使用 Consul 来存储配置

    [翻译] 如何在 ASP.Net Core 中使用 Consul 来存储配置 原文: USING CONSUL FOR STORING THE CONFIGURATION IN ASP.NET COR ...

  6. 【翻译】介绍 ASP.NET Core 中的 Razor Pages

    介绍 ASP.NET Core 中的 Razor Pages 原文地址:Introduction to Razor Pages in ASP.NET Core         译文地址:介绍 asp. ...

  7. ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...

  8. ASP.NET Core 中文文档目录

    翻译计划 五月中旬 .NET Core RC2 如期发布,我们遂决定翻译 ASP.NET Core 文档.我们在 何镇汐先生. 悲梦先生. 张仁建先生和 雷欧纳德先生的群中发布了翻译计划招募信息,并召 ...

  9. ASP.NET Core中的依赖注入(1):控制反转(IoC)

    ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化&qu ...

随机推荐

  1. UVA1627-Team them up!(动态规划)

    Problem UVA1627-Team them up! Total Submissions:3577  Solved:648 Time Limit: 3000 mSec Problem Descr ...

  2. UVA1347-Tour(动态规划基础)

    Problem UVA1347-Tour Accept: 667  Submit: 3866Time Limit: 3000 mSec Problem Description John Doe, a ...

  3. 提高git下载速度(非代理或修改HOST)

    1. 利用开源中国提供的代码仓库 标题已经说的很清楚了,我想对于经常使用git的人来讲,很可能已经知道了.对于新手刚接触git的人来讲,可能你只知道github. 实际上,国内也有很多代码仓库提供方, ...

  4. Oracle会话超时退出设置

    前一段时间客户打电话说自从数据库搬迁后连接数据库总是提示会话不可用,和客户沟通才知到他们连接数据库的程序是从早上连上数据库后就一直保持连接状态,一天中需要执行几次操作,由于数据库中的会话连接有超时限制 ...

  5. WiFi-ESP8266入门http(3-1)网页认证上网-post请求(原教程)

    教程:http://geek-workshop.com/thread-37484-1-1.html 源码:链接:https://pan.baidu.com/s/1yuYYqsM-WSOb0AbyAT0 ...

  6. ActiveMQ安装配置及使用 转发 https://www.cnblogs.com/hushaojun/p/6016709.html

    ActiveMQ安装配置及使用 ActiveMQ介绍 ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JM ...

  7. 深度学习框架PyTorch一书的学习-第六章-实战指南

    参考:https://github.com/chenyuntc/pytorch-book/tree/v1.0/chapter6-实战指南 希望大家直接到上面的网址去查看代码,下面是本人的笔记 将上面地 ...

  8. KindEditor 开源得富文本编辑器

    正常HTML情况写输入长文本需要textarea 标签 .但textarea 标签局限性很大,切只能输入单一的文本,我们大多情况下看到的新闻类文本信息大多是图文混排得,且有的配有视频和音乐. 我们可以 ...

  9. 后端list集合中的数据传递到前台HTML中显示(表格形式)

    关键字:web项目中前后台数据传递问题 在学习web项目的过程中,我们肯定会遇到前后台数据交换问题.这个问题我也思考了很久,今天借此总结一下.由于博主水平有限,如有不当之处,还请大家多多指正,,废话不 ...

  10. Git Submodule管理项目子模块

    使用场景 当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能. 常用命令 git clone ...