基于配置值的 .NET Core 验证属性
.NET core validation attributes based on configuration values
我正在寻找一种将配置(选项)中的值注入验证属性参数的方法。
让我印象深刻的场景是脚手架身份 UI。
它提供了配置密码长度选项的可能性。但是在生成的注册页面上不考虑更改。这是因为在页面上,验证属性的值是硬编码的。
有人知道这是否可能吗?
可以使用启动时设置的选项来验证密码。
这是剃刀页面的示例,其中使用多个验证器检查密码,并将任何错误添加到 ModelState
中,它们将出现在 ValidationSummary 中。
foreach (var validator in _userManager.PasswordValidators)
{
var passCheck = await validator.ValidateAsync(_userManager, null, Input.Password);
if (!passCheck.Succeeded)
{
foreach (var error in passCheck.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
return Page();
}
}
所以简单的验证将在客户端执行,然后此代码将运行服务器端强制执行密码选项。
如果我没记错的话,你正试图做一些下面不可能的事情:
public int passLength = 3;
public class Person
{
[MaxLength(passLength)]
public DateTime? DateOfBirth { get; set; }
}
据我所知,没有解决方法。您可以尝试自定义验证器并根据需要使用配置服务。您可以查看此示例代码
public class CustomPasswordAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var configuration = (IConfiguration)validationContext
.GetService(typeof(IConfiguration));
if (!(value is String))
{
return new ValidationResult("Should be string");
}
int.TryParse(configuration["Validation:PasswordLength"], out int passLength);
if (value.ToString().Length != passLength)
{
return new ValidationResult("Wrong Length");
}
return ValidationResult.Success;
}
}
public class UserModel
{
[CustomPassword]
public string Password { get; set; }
}
我正在寻找一种将配置(选项)中的值注入验证属性参数的方法。
让我印象深刻的场景是脚手架身份 UI。
它提供了配置密码长度选项的可能性。但是在生成的注册页面上不考虑更改。这是因为在页面上,验证属性的值是硬编码的。
有人知道这是否可能吗?
可以使用启动时设置的选项来验证密码。
这是剃刀页面的示例,其中使用多个验证器检查密码,并将任何错误添加到 ModelState
中,它们将出现在 ValidationSummary 中。
foreach (var validator in _userManager.PasswordValidators)
{
var passCheck = await validator.ValidateAsync(_userManager, null, Input.Password);
if (!passCheck.Succeeded)
{
foreach (var error in passCheck.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
return Page();
}
}
所以简单的验证将在客户端执行,然后此代码将运行服务器端强制执行密码选项。
如果我没记错的话,你正试图做一些下面不可能的事情:
public int passLength = 3;
public class Person
{
[MaxLength(passLength)]
public DateTime? DateOfBirth { get; set; }
}
据我所知,没有解决方法。您可以尝试自定义验证器并根据需要使用配置服务。您可以查看此示例代码
public class CustomPasswordAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var configuration = (IConfiguration)validationContext
.GetService(typeof(IConfiguration));
if (!(value is String))
{
return new ValidationResult("Should be string");
}
int.TryParse(configuration["Validation:PasswordLength"], out int passLength);
if (value.ToString().Length != passLength)
{
return new ValidationResult("Wrong Length");
}
return ValidationResult.Success;
}
}
public class UserModel
{
[CustomPassword]
public string Password { get; set; }
}