Файл конфигурации валидации Enterprise Library 6
Я пытаюсь выучить EnterpriseLibraryValidatoin. когда я настраиваю TypeValidation для проверки класса через конфигурационный файл, он не подхватывает. но когда я добавляю аннотации данных, это правильно проверяет, я не знаю, оставляю ли я что-то
любая помощь, пожалуйста
файл конфигурации проверки
<validation>
<type name="ValidationBlockExample.Person" defaultRuleset="ValidimiFushave"
assemblyName="ValidationBlockExample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<ruleset name="ValidimiFushave">
<fields>
<field name="LastName">
<validator type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.NotNullValidator, Microsoft.Practices.EnterpriseLibrary.Validation, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
messageTemplate="Last Name Required!" name="Not Null Validator" />
</field>
</fields>
</ruleset>
</type>
код для проверки
ValidationFactory.SetDefaultConfigurationValidatorFactory(new SystemConfigurationSource(false));
Validator<Person> pValidator = ValidationFactory.CreateValidator<Person>();
Person prsn = new Person();
prsn.FirstName = "Name";
////prsn.LastName = "Haz";
prsn.Age = 31;
ValidationResults valResults = pValidator.Validate(prsn);
if (!valResults.IsValid)
{
foreach (var valResult in valResults)
{
Console.WriteLine(valResult.Message);
}
}
else
Console.WriteLine("Preson Validated !!!");
Console.ReadLine();
класс для проверки
public class Person
{
public string FirstName { get; set; }
//[Required]
public string LastName { get; set; }
public int Age { get; set; }
}
2 ответа
Согласно Microsoft Enterprise Library 6 - финальная версия, примечания к выпуску
Блок приложения проверки
Класс ValidationFactory больше не создает свою конфигурацию автоматически из файла конфигурации. Теперь вы должны вызвать метод SetDefaultConfigurationValidatorFactory, чтобы загрузить конфигурацию из файла конфигурации. Это серьезное изменение.
Итак, как мне было предложено, сделать это:
ValidationFactory.SetDefaultConfigurationValidatorFactory(
new SystemConfigurationSource());
прежде чем вы подтвердите.
Этот ответ предназначен для .net core 6:
Во-первых, вам нужно сохранить все необходимые параметры в файле конфигурации.
appsettings.json
{
"Account": {
"PasswordMinLength": 8,
"PasswordPattern": "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*#?&])[A-Za-z\\d@$!%*#?&]*$"
}
}
Затем вам нужно создать собственный класс атрибутов Validator:
(если хотите, вы можете создать этот класс непосредственно в своем классе ViewModel)
class MyPasswordValidater : ValidationAttribute
{
private readonly int MinimumLength;
private readonly string MatchPattern;
private readonly string FieldName;
public MyPasswordValidater(
string configFilePath="appsettings.json",
string fieldName="Password"
) : base() {
using StreamReader r = new(configFilePath);
string json = r.ReadToEnd();
dynamic obj = ((dynamic)JsonConvert.DeserializeObject(json))["Account"];
MinimumLength = (int)obj["PasswordMinLength"];
MatchPattern = (string)obj["PasswordPattern"];
FieldName = fieldName;
}
public override bool IsValid(object value)
{
if (value == null || value.ToString().Length == 0)
{
ErrorMessage = $"{FieldName} is required";
return false;
}
if (value.ToString().Length < MinimumLength)
{
ErrorMessage = $"{FieldName} must be at least {MinimumLength} characters";
return false;
}
if (!Regex.IsMatch(value.ToString(), MatchPattern))
{
ErrorMessage = $"{FieldName} does not meet requirements";
return false;
}
return true;
}
}
Обратите внимание, что в конструкторе значение извлекается из файла appsettings.json, где оно затем сохраняется до тех пор, пока не произойдет проверка.
Последний шаг — присвоение атрибута нужному полю:
[MyPasswordValidater()]
public string Password { get; set; }
[MyPasswordValidater(fieldName: "Confirm Password")]
public string ConfirmPassword { get; set; }
Поскольку у конструктора нет обязательных параметров, вам не нужно ничего передавать валидатору, но вы можете изменить имя поля, отображаемое в сообщениях об ошибках.
Это проверит требуемую, минимальную длину и соответствие регулярному выражению (которое я использовал, чтобы определить, имеет ли пароль специальные символы и верхний/нижний регистр).