C# 在MVC5中重用验证属性

C# 在MVC5中重用验证属性,c#,validation,asp.net-mvc-5,entity-framework-6,C#,Validation,Asp.net Mvc 5,Entity Framework 6,我已经做了很多关于验证和它如何工作的研究。我知道我们可以使用属性,甚至可以制作自定义属性,我们可以将这些属性扔到ViewModels上以验证数据。虽然这一切都很好,但我发现自己在多个ViewModel上重用了相同的属性组合 例如,让我们取一个“名字”,在项目X中取一个名字,无论它是电影名、书名、人名、姓氏等等。。。它毕竟是一个名称,因此我倾向于应用90%的相同验证属性。必需,最小长度3,最大长度50,仅字母、空格等。。。你明白了 现在我得到了一个叠加了5+个属性的变量。这些是预先构建的属性,我不

我已经做了很多关于验证和它如何工作的研究。我知道我们可以使用属性,甚至可以制作自定义属性,我们可以将这些属性扔到ViewModels上以验证数据。虽然这一切都很好,但我发现自己在多个ViewModel上重用了相同的属性组合

例如,让我们取一个“名字”,在项目X中取一个名字,无论它是电影名、书名、人名、姓氏等等。。。它毕竟是一个名称,因此我倾向于应用90%的相同验证属性。必需,最小长度3,最大长度50,仅字母、空格等。。。你明白了

现在我得到了一个叠加了5+个属性的变量。这些是预先构建的属性,我不希望再次编码,因为它们已经为我编码了。所以我的问题是:


如何创建CustomValidateName属性,该属性将验证所有这些内容,根据错误提供不同的错误消息,同时重用.NET framework中的一些内置属性,这样我就不会重新发明轮子了。这里的底线是,只要我有一个Name变量,我现在就可以将这个属性而不是普通的5+。

Use可以为所有验证创建自定义验证

例如:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Web;  
using System.ComponentModel.DataAnnotations;  
using System.Text.RegularExpressions;  

namespace Custom_DataAnnotation_Attribute.Models  
{  
    public class CustomEmailValidator : ValidationAttribute  
    {  
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)  
        {  
            if (value != null)  
            {  
                string email = value.ToString();  

                if (Regex.IsMatch(email, @"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", RegexOptions.IgnoreCase))  
                {  
                    return ValidationResult.Success;  
                }  
                else  
                {  
                    return new ValidationResult("Please Enter a Valid Email.");  
                }  
            }  
            else  
            {  
                return new ValidationResult("" + validationContext.DisplayName + " is required");  
            }  
        }  
上述方法为所需的nd电子邮件类型生成验证

您可以使用If-Else或Switch在此方法中添加更多验证,并还原custome消息

At型号:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Web;  
using System.ComponentModel.DataAnnotations;  

namespace Custom_DataAnnotation_Attribute.Models  
{  
    public class EmployeeModel  
    {  
        public string Name { get; set; }  

        [CustomEmailValidator]  
        public string Email { get; set; }  
        public string Password { get; set; }  
        public string Mobile { get; set; }          
    }  
}  

您是否考虑过具有该属性的基础视图模型及其验证attributes@StephenMuecke是的,但我觉得这些对象链会互相延伸,这会让调试成为一场噩梦。或者我会有一个基本对象,它有很多东西被两个视图模型使用,但不是全部,这会使它变得杂乱无章,并且很难调试。我想看看是否有可能创建一个自定义属性,并在其中引用其他属性,并根据结果提供自定义错误消息。有几个问题:1)验证通常是相似的,但在不同层甚至视图之间并不完全相同。例如,插入表单比更新表单更轻松。不过,插入表单之后的POST-API将更加严格。最终,您可能会在一个文件中拥有15-20个不同的设置,远离它们的使用点(每个场景4-5个),而不是ViewModel上实际需要它们的5个属性。2) 控件和库知道DataAnotation属性。您必须复制许多功能您可以使用操作过滤器而不是属性,尽管我不确定这会对性能产生什么影响您可以通过反向工程来了解它是如何实现的。注意<代码>ModelValidatorProviders.Providers.Remove(ModelValidatorProviders.Providers.FirstOrDefault(x=>x是DataAnnotationsModelValidatorProvider))和
ModelValidatorProviders.Providers.Add(新的ExpressiveAnnotationsModelValidatorProvider())这不是OP要求的谢谢你的回复。你看到那行写着if regex ismatch的代码了吗?通过放置属性
[EmailAddress(ErrorMessage=“Invalid Email Address”)]
已经可以完成该检查,因此此时它正在重新发明轮子。我试图在custome属性中重用上面的代码行,如果它已经存在,我就不必编写自己的验证。另一个问题是如何只返回一个错误?我宁愿全部验证,并将所有错误返回给用户,这样他就不会提交5次。