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

使用数据注释在c#中进行数据验证,c#,regex,validation,data-annotations,data-modeling,C#,Regex,Validation,Data Annotations,Data Modeling,我正在将客户机的数据迁移到新数据库(SQL SERVER),需要对其验证所有属性。 我尝试添加数据注释,但效果不理想 以下是我的示例代码: public class SellerDetailModel { [Required, RegularExpression("[0-9]{2}[0-9A-Z]{13}")] public string GSTNumber; [Required, StringLength(100

我正在将客户机的数据迁移到新数据库(SQL SERVER),需要对其验证所有属性。 我尝试添加数据注释,但效果不理想

以下是我的示例代码:

 public class SellerDetailModel
    {
        [Required, RegularExpression("[0-9]{2}[0-9A-Z]{13}")]
        public string GSTNumber; 

        [Required, StringLength(100, MinimumLength = 3)]
        public string LegalName;

        [StringLength(100, MinimumLength = 3)]
        public string TradingName;

        [Required, StringLength(100, MinimumLength = 3)]
        public string Address1;

        [StringLength(100, MinimumLength = 3)]
        public string Address2;

        [Required, StringLength(50, MinimumLength = 3)]
        public string Location;

        [Required, StringLength(6)]
        public int PinCode;

        [Required, StringLength(2, MinimumLength = 1)]
        public string StateCode;

        [StringLength(12, MinimumLength = 6)]
        public string ContactNumber;

        [Required, StringLength(100, MinimumLength = 6)]
        public string EmailId;
    }
现在,在另一个类(业务逻辑)中,我给这个类赋值

//"invoice" is an object having seller related data

SellerDetailModel dataTransferObject = new SellerDetailModel
                    {
                        GSTNumber = invoice.SellerGSTNumber,
                        LegalName = invoice.SellerLegalName,
                        TradingName = invoice.SellerTradingName,
                        Address1 = invoice.SellerAddress1,
                        Address2 = invoice.SellerAddress2,
                        Location = invoice.SellerLocation,
                        PinCode = Convert.ToInt32(invoice.SellerPinCode),
                        StateCode = invoice.SellerStateCode,
                        ContactNumber = invoice.SellerContactNumber,
                        EmailId = invoice.SellerEmailId,
                    };

   
但即使在添加了必需的属性、正则表达式、字符串长度等之后,它也根本没有被验证, 它仍然接受所有的空值。 有人能帮助我如何验证这些属性吗

如果在迁移过程中发生错误,我只想创建一个日志数据

编辑 我已经尝试了下面的方法,但仍然不工作

public string Validate()
        {
            ValidationContext context = new ValidationContext(this);
            List<ValidationResult> results = new List<ValidationResult>();
            bool isValid = Validator.TryValidateObject(this, context, results, true);

            if (!isValid)
            {
                StringBuilder sbrErrors = new StringBuilder();
                foreach (var validationResult in results)
                {
                    sbrErrors.AppendLine(validationResult.ErrorMessage);
                }
                return sbrErrors.ToString();
            }
            else
                return string.Empty;
        }


 var validation = dataTransferObject.Validate() //always gives string.Empty
公共字符串验证()
{
ValidationContext=新的ValidationContext(此);
列表结果=新列表();
bool isValid=Validator.TryValidateObject(this,context,results,true);
如果(!isValid)
{
StringBuilder sbrErrors=新建StringBuilder();
foreach(结果中的var validationResult)
{
sberrors.AppendLine(validationResult.ErrorMessage);
}
返回sbrrors.ToString();
}
其他的
返回字符串。空;
}
var validation=dataTransferObject.Validate()//始终提供string.Empty

问题在于ValidationContext使用属性而不是字段

我通过反编译ValidationContext类找到了答案,发现它只会搜索属性

public class SellerDetailModel
{
    [Required, RegularExpression("[0-9]{2}[0-9A-Z]{13}")]
    public string GSTNumber { get; set; }

    [Required, StringLength(100, MinimumLength = 3)]
    public string LegalName { get; set; }

    [StringLength(100, MinimumLength = 3)] 
    public string TradingName { get; set; }

    [Required, StringLength(100, MinimumLength = 3)]
    public string Address1 { get; set; }

    [StringLength(100, MinimumLength = 3)]
    public string Address2 { get; set; }

    [Required, StringLength(50, MinimumLength = 3)]
    public string Location { get; set; }

    [Required, StringLength(6)]
    public string PinCode { get; set; }

    [Required, StringLength(2, MinimumLength = 1)]
    public string StateCode { get; set; }

    [StringLength(12, MinimumLength = 6)]
    public string ContactNumber { get; set; }

    [Required, StringLength(100, MinimumLength = 6)]
    public string EmailId { get; set; }

    public string Validate()
    {
        ValidationContext context = new ValidationContext(this);
        List<ValidationResult> results = new List<ValidationResult>();
        bool isValid = Validator.TryValidateObject(this, context, results, true);

        if (!isValid)
        {
            StringBuilder sbrErrors = new StringBuilder();
            foreach (ValidationResult validationResult in results)
            {
                sbrErrors.AppendLine(validationResult.ErrorMessage);
            }
            return sbrErrors.ToString();
        }
        else
            return string.Empty;
    }
}
您需要将代码更改为该格式才能使其工作,因为字段已转换为属性

public class SellerDetailModel
{
    [Required, RegularExpression("[0-9]{2}[0-9A-Z]{13}")]
    public string GSTNumber { get; set; }

    [Required, StringLength(100, MinimumLength = 3)]
    public string LegalName { get; set; }

    [StringLength(100, MinimumLength = 3)] 
    public string TradingName { get; set; }

    [Required, StringLength(100, MinimumLength = 3)]
    public string Address1 { get; set; }

    [StringLength(100, MinimumLength = 3)]
    public string Address2 { get; set; }

    [Required, StringLength(50, MinimumLength = 3)]
    public string Location { get; set; }

    [Required, StringLength(6)]
    public string PinCode { get; set; }

    [Required, StringLength(2, MinimumLength = 1)]
    public string StateCode { get; set; }

    [StringLength(12, MinimumLength = 6)]
    public string ContactNumber { get; set; }

    [Required, StringLength(100, MinimumLength = 6)]
    public string EmailId { get; set; }

    public string Validate()
    {
        ValidationContext context = new ValidationContext(this);
        List<ValidationResult> results = new List<ValidationResult>();
        bool isValid = Validator.TryValidateObject(this, context, results, true);

        if (!isValid)
        {
            StringBuilder sbrErrors = new StringBuilder();
            foreach (ValidationResult validationResult in results)
            {
                sbrErrors.AppendLine(validationResult.ErrorMessage);
            }
            return sbrErrors.ToString();
        }
        else
            return string.Empty;
    }
}

属性不会验证任何内容。它们告诉验证器如何进行验证。首先你有验证器吗?而且,验证模型属性的任务与您正在使用的数据库几乎无关。@GSerg您能解释一下如何添加验证器吗?(我是c#的新手)这能回答你的问题吗?我试过了,但还是不行,