简体   繁体   English

使用数据注释在 Winform 中进行验证

[英]Validation in Winform using Data Annotations

I create a validating class like so:我像这样创建一个验证类:

public interface IDataErrorInfo
{
    string this[string columnName] { get; }
    string Error { get; }
}

public class BaseModel : IDataErrorInfo
{
   [Browsable(false)]
   public string this[string property]
    {
        get
        {
            var propertyDescriptor = TypeDescriptor.GetProperties(this)[property];
            if (propertyDescriptor == null)
                return string.Empty;

            var results = new List<ValidationResult>();
            var result = Validator.TryValidateProperty(
                                      propertyDescriptor.GetValue(this),
                                      new ValidationContext(this, null, null)
                                      { MemberName = property },
                                      results);
            if (!result)
                return results.First().ErrorMessage;
            return string.Empty;
        }
    }

    [Browsable(false)]
    public string Error
    {
        get
        {
            var results = new List<ValidationResult>();
            var result = Validator.TryValidateObject(this,
                new ValidationContext(this, null, null), results, true);
            if (!result)
                return string.Join("\n", results.Select(x => x.ErrorMessage));
            else
                return null;
        }
    }
}

Then I created a class with data annotation like so然后我像这样创建了一个带有数据注释的类

public class ReaderSetting : BaseModel
{
    [JsonPropertyName("RfidAddress")]
    [Required(AllowEmptyStrings = false, ErrorMessage = "RFID Address is required.")]
    [StringLength(3, ErrorMessage = "Max Length is 3")]
    public string RfidAddress { get; set; }
}

Then I tried this out like this:然后我像这样尝试了这个:

private void btnAddSetting_Click(object sender, EventArgs e)
{
    var readerSetting = new ReaderSetting();
    try
    {
        readerSetting.RfidAddress = txtRfidAddress.Text; // txtRfidAddress.Text is blank
    }
    catch (ValidationException ex)
    {
        Console.WriteLine(ex.Message);
    }
    _readerSettingList.Add(readerSetting);
    var source = new BindingSource();
    source.DataSource = _readerSettingList;
    dgRfidSettings.DataSource = source;
}

How come it doesn't pass through the ValidationException?为什么它不通过ValidationException?

See if the following might work for you.看看以下内容是否适合您。

Try it out on .NET Fiddle ..NET Fiddle上尝试一下。

public class ReaderSetting
{
    [JsonPropertyName("RfidAddress")]
    [Required(AllowEmptyStrings = false, ErrorMessage = "RFID Address is required.")]
    [StringLength(3, ErrorMessage = "Max Length is 3")]
    public string RfidAddress { get; set; }
}

public class EntityValidationResult
{
    public IList<ValidationResult> Errors { get; set; }
    public bool IsValid => Errors.Count == 0;
    public EntityValidationResult(IList<ValidationResult> errors = null)
    {
        Errors = errors ?? new List<ValidationResult>();
    }
}
public class EntityValidator<T> where T : class
{
    public EntityValidationResult Validate(T entity)
    {
        var validationResults = new List<ValidationResult>();
        var vc = new ValidationContext(entity, null, null);
        Validator.TryValidateObject(entity, vc, validationResults, true);

        return new EntityValidationResult(validationResults);
    }
}

Usage用法

ReaderSetting readerSetting = new() { RfidAddress = "abcd" };
EntityValidator<ReaderSetting> validator = new EntityValidator<ReaderSetting>();
EntityValidationResult result = validator.Validate(readerSetting);
if (result.IsValid)
{
    Console.WriteLine("Valid");
}
else
{
    result.Errors.ToList().ForEach(x => Console.WriteLine(x.ErrorMessage));
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM