在MVC5中重用验证属性

时间:2016-04-05 20:45:34

标签: c# validation asp.net-mvc-5 entity-framework-6

我一直在进行大量关于验证及其工作原理的研究。我知道我们可以使用属性甚至可以创建自定义属性,我们可以将这些属性放在ViewModel上以验证数据。虽然这一切都运行正常,但我发现自己在多个ViewModel上重复使用相同的属性组合。

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

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

如何创建一个CustomValidateName属性,该属性将验证所有这些内容,根据错误提供不同的错误消息,同时重用.NET框架中的一些内置属性,以便我没有重新发明轮子。这里的底线是,每当我有一个Name变量时,我现在可以只放一个属性而不是正常的5 +。

1 个答案:

答案 0 :(得分:0)

使用可以为您的所有验证创建自定义验证

例如:

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并还原自定义消息

在模特:

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; }          
    }  
}