asp.net-mvc - 按条件更改 ASP.NET MVC 3 中属性的验证

标签 asp.net-mvc asp.net-mvc-3 validation validationattribute

这是我的模型:

[RegularExpression(@"^08[589][0-9]{8}$", ErrorMessage = "Invalid Number!")]
public string Phone { get; set; }

[ForeignKey]
public long PhoneType { get; set; } // 1-CellPhone , 2-Phone

所以我想通过更改 PhoneType 来更改 RegularExpression 验证,如果我想说得更具体的话:

如果用户从 DropDownList 中选择 CellPhone 则验证为

[RegularExpression(@"^08[589][0-9]{8}$", ErrorMessage = "Invalid Number!")] 

如果选择Phone,则验证为

 [RegularExpression("^[1-9][0-9]{9}$", ErrorMessage = "Invalid Number!")]

你有什么建议?

最佳答案

您可以编写自定义验证属性:

public class PhoneAttribute : ValidationAttribute
{
    private readonly string _phoneTypeProperty;
    public PhoneAttribute(string phoneTyperoperty)
    {
        _phoneTypeProperty = phoneTyperoperty;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var property = validationContext.ObjectType.GetProperty(_phoneTypeProperty);
        if (property == null)
        {
            return new ValidationResult(string.Format("Unknown property: {0}", _phoneTypeProperty));
        }

        var phone = Convert.ToString(value, CultureInfo.CurrentCulture);
        if (string.IsNullOrEmpty(phone))
        {
            return null;
        }

        var phoneType = (long)property.GetValue(validationContext.ObjectInstance, null);
        Regex regex = null;
        if (phoneType == 1)
        {
            regex = new Regex(@"^08[589][0-9]{8}$");
        }
        else if (phoneType == 2)
        {
            regex = new Regex("^[1-9][0-9]{9}$");
        }
        else
        {
            return new ValidationResult(string.Format("Unknown phone type: {0}", phoneType));
        }

        var match = regex.Match(phone);
        if (match.Success && match.Index == 0 && match.Length == phone.Length)
        {
            return null;
        }

        return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
    }
}

然后用这个属性装饰你的 View 模型属性:

public class MyViewModel
{
    [Phone("PhoneType", ErrorMessage = "Invalid Number!")]
    public string Phone { get; set; }

    public long PhoneType { get; set; }
}

如果您想通过验证让您的生活更轻松,另一种可能性(我强烈推荐)是使用 FluentValidation.NET .只需看看定义验证规则而不是编写大量的管道代码是多么容易,并且不再能够理解哪部分是管道,哪部分是实际验证。使用 FluentValidation.NET 没有管道。您以流利的方式表达您的验证要求:

public class MyViewModelValidator : AbstractValidator<MyViewModel>
{
    public MyViewModelValidator()
    {
        RuleFor(x => x.Phone)
            .Matches(@"^08[589][0-9]{8}$").When(x => x.PhoneType == 1)
            .Matches("^[1-9][0-9]{9}$").When(x => x.PhoneType == 2);
    }
}

只需将此验证器与之前的验证器进行比较即可。

关于asp.net-mvc - 按条件更改 ASP.NET MVC 3 中属性的验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10480509/

相关文章:

C# MVC 3 验证在特定 View 上失败

javascript - 验证以前不可见的字段

jquery - 使用 jQuery validate 验证字段组

ruby-on-rails - Rails Validator - 只有字母数字而不是所有数字

c# - ASP.NET MVC 3 中的线程

javascript - 使用 jquery/javascript 的正整数值

javascript - 如何在mvc 4中使用foreach显示每页的限制?

asp.net-mvc - 创建类似于 Stack Overflow 的 "short permalink to this question"的短永久链接

c# - EF 4 和 POCO 的最佳实践/入门解决方案

c# - 无法在 MonoDevelop 中打开 ASP.NET MVC 3 解决方案的测试项目