ASP.NET MVC5是一个非常强大的web应用开发框架,而Fluent Validation则是一个轻量级但功能丰富的验证框架,使得开发人员可以轻松地为MVC5应用程序添加自定义验证规则。本文将介绍如何在ASP.NET MVC5应用程序中使用Fluent Validation进行验证。
步骤1:安装FluentValidation库
首先,我们需要在我们的MVC5项目中安装FluentValidation库。我们可以通过NuGet包管理器来安装FluentValidation:
PM> Install-Package FluentValidation
步骤2:创建Fluent Validation验证器
我们可以为我们的模型类定义一个Fluent Validation验证器。例如,如果我们有一个名为Person
的模型类,我们可以创建一个名为PersonValidator
的验证器:
using FluentValidation;
public class PersonValidator : AbstractValidator<Person>
{
public PersonValidator()
{
RuleFor(p => p.Name).NotEmpty();
RuleFor(p => p.Email).EmailAddress();
RuleFor(p => p.Age).InclusiveBetween(18, 60);
}
}
在上面的示例中,我们定义了三个规则:
Name
属性不能为空。Email
属性必须符合电子邮件地址的格式。Age
属性必须在18到60岁之间。
步骤3:在控制器中使用验证器
在我们的控制器代码中,我们可以使用我们之前创建的验证器来验证模型类。例如:
using FluentValidation.Results;
using FluentValidation;
public class PersonController : Controller
{
public ActionResult Create(Person person)
{
PersonValidator validator = new PersonValidator();
ValidationResult validationResult = validator.Validate(person);
if (validationResult.IsValid)
{
// 执行其它操作
}
else
{
foreach (ValidationError error in validationResult.Errors)
{
ModelState.AddModelError(error.PropertyName, error.ErrorMessage);
}
}
return View(person);
}
}
在上面的示例中,我们创建了一个新的PersonValidator
实例并使用Validate
方法对传入的Person
对象进行验证。如果验证成功,我们可以执行其他操作。否则,我们可以将验证器返回的错误信息添加到ModelState
中。
示例1:验证表单数据
下面是一个示例,展示了如何在MVC5应用程序中使用Fluent Validation验证表单数据。我们将创建一个假设用户注册表单,包含姓名、电子邮件和年龄。
- 在
Models
文件夹中创建一个名为User
的模型类:
public class User
{
public string Name { get; set; }
public string Email { get; set; }
public int Age { get; set; }
}
- 在模型类中引用FluentValidation库:
using FluentValidation;
- 创建一个名为
UserValidator
的验证器类,并将其继承自AbstractValidator<User>
:
public class UserValidator : AbstractValidator<User>
{
public UserValidator()
{
RuleFor(u => u.Name).NotEmpty().WithMessage("姓名不能为空");
RuleFor(u => u.Email).NotEmpty().WithMessage("电子邮件不能为空").EmailAddress().WithMessage("电子邮件格式不正确");
RuleFor(u => u.Age).InclusiveBetween(18, 60).WithMessage("年龄必须在18到60之间");
}
}
在上面的示例中,我们为Name
属性定义一个必填规则,并通过WithMessage
方法为错误消息指定了自定义文本。类似的规则应用于Email
和Age
属性。
- 在控制器中,编写一个用于处理用户注册表单数据的方法:
public ActionResult Create(User user)
{
UserValidator validator = new UserValidator();
ValidationResult validationResult = validator.Validate(user);
if (validationResult.IsValid)
{
// 执行其它操作
}
else
{
foreach (ValidationError error in validationResult.Errors)
{
ModelState.AddModelError(error.PropertyName, error.ErrorMessage);
}
}
return View(user);
}
在上面的示例中,我们创建了一个UserValidator
实例,并使用其Validate
方法对传入的User
对象进行验证。如果验证成功,我们可以执行其他操作。否则,我们将验证器返回的错误信息添加到ModelState
中。
- 最后,在创建用户注册表单的视图中,我们可以使用
Html.ValidationMessage
辅助方法来显示验证错误消息。例如:
<form>
<label>姓名:</label>
@Html.TextBoxFor(m => m.Name)
@Html.ValidationMessageFor(m => m.Name)
<label>电子邮件:</label>
@Html.TextBoxFor(m => m.Email)
@Html.ValidationMessageFor(m => m.Email)
<label>年龄:</label>
@Html.TextBoxFor(m => m.Age)
@Html.ValidationMessageFor(m => m.Age)
<input type="submit" value="注册" />
</form>
在上面的示例中,我们在每个输入字段的下方使用ValidationMessageFor
方法显示验证错误消息。
示例2:使用Fluent Validation自定义验证规则
下面是一个示例,展示了如何使用Fluent Validation自定义验证规则。我们将创建一个验证器,验证邮政编码是否位于指定的国家/地区范围内。
- 创建一个名为
PostalCodeValidator
的验证器类,并将其继承自PropertyValidator
:
public class PostalCodeValidator : PropertyValidator
{
private readonly string[] _allowedCountries;
public PostalCodeValidator(string[] allowedCountries) : base("邮政编码不符合指定的国家/地区规则")
{
_allowedCountries = allowedCountries;
}
protected override bool IsValid(PropertyValidatorContext context)
{
string value = (string)context.PropertyValue;
string countryCode = GetCountryCodeFromDatabase(); // 从数据库获取当前用户所在的国家/地区代码
if (!_allowedCountries.Contains(countryCode)) return true; // 如果当前用户的国家不在允许的列表中,则忽略邮政编码的验证
string regexPattern = GetRegexPatternFromDatabase(countryCode); // 根据当前用户所在的国家/地区代码从数据库获取与之匹配的正则表达式
return Regex.IsMatch(value, regexPattern); // 验证邮政编码是否符合规则
}
}
在上面的示例中,我们定义了一个名为PostalCodeValidator
的类,并将其继承自PropertyValidator
。我们还指定了一个构造函数,接受一个允许的国家/地区代码数组。在IsValid
方法中,我们首先从PropertyValidatorContext
中获取邮政编码的值,然后从数据库中检索当前用户所在的国家/地区代码。如果当前用户的国家不在允许的列表中,则我们认为邮政编码验证已通过。否则,我们从数据库中获取与当前用户所在的国家/地区代码匹配的正则表达式,然后使用Regex.IsMatch
方法验证邮政编码是否符合规则。
- 在我们的Model类中定义一个名为
PostalCode
的属性:
public string PostalCode { get; set; }
- 创建一个名为
AddressValidator
的验证器类,并在其中添加一个针对PostalCode
属性的自定义验证规则:
public class AddressValidator : AbstractValidator<Address>
{
public AddressValidator()
{
...
RuleFor(a => a.PostalCode).SetValidator(new PostalCodeValidator(new string[] { "US", "CA", "UK", "DE" }));
}
}
在上面的示例中,我们在AddressValidator
中设置了一个针对PostalCode
属性的自定义验证规则。我们创建了一个名为PostalCodeValidator
的新实例,并使用SetValidator
方法将其添加到验证器中。我们还将允许的国家/地区代码数组传递给构造函数。
通过这种方式,我们可以为我们的MVC5应用程序添加自定义验证规则,而无需编写大量的验证代码。这使得代码更易于维护和扩展,并且可以保持我们的验证逻辑与实际代码的分离。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ASP.NET MVC5验证系列之Fluent Validation - Python技术站