ASP.NET MVC:自定义验证通过DataAnnotationASP.NET MVC:自定义验证

2019-05-08 14:47发布

我有4级性能,这是字符串类型的模型。 我知道你可以通过使用StringLength注释验证单个属性的长度。 但是我要验证的4个属性组合的长度。

什么是MVC方式与数据注解做到这一点?

我问这个,因为我是新来的MVC,并希望使自己的解决方案之前,做了正确的道路。

Answer 1:

你可以写一个自定义的验证属性:

public class CombinedMinLengthAttribute: ValidationAttribute
{
    public CombinedMinLengthAttribute(int minLength, params string[] propertyNames)
    {
        this.PropertyNames = propertyNames;
        this.MinLength = minLength;
    }

    public string[] PropertyNames { get; private set; }
    public int MinLength { get; private set; }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var properties = this.PropertyNames.Select(validationContext.ObjectType.GetProperty);
        var values = properties.Select(p => p.GetValue(validationContext.ObjectInstance, null)).OfType<string>();
        var totalLength = values.Sum(x => x.Length) + Convert.ToString(value).Length;
        if (totalLength < this.MinLength)
        {
            return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));
        }
        return null;
    }
}

然后你可能有一个视图模型和装饰它与它的特性之一:

public class MyViewModel
{
    [CombinedMinLength(20, "Bar", "Baz", ErrorMessage = "The combined minimum length of the Foo, Bar and Baz properties should be longer than 20")]
    public string Foo { get; set; }
    public string Bar { get; set; }
    public string Baz { get; set; }
}


Answer 2:

自我验证模型

你的模型应该实现一个接口IValidatableObject 。 把你的验证码Validate方法:

public class MyModel : IValidatableObject
{
    public string Title { get; set; }
    public string Description { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (Title == null)
            yield return new ValidationResult("*", new [] { nameof(Title) });

        if (Description == null)
            yield return new ValidationResult("*", new [] { nameof(Description) });
    }
}

请注意:这是一个服务器端验证。 它不会对客户端的工作。 您的验证后,才提交表单进行。



Answer 3:

ExpressiveAnnotations为您提供了这样的可能性:

[Required]
[AssertThat("Length(FieldA) + Length(FieldB) + Length(FieldC) + Length(FieldD) > 50")]
public string FieldA { get; set; }


Answer 4:

背景:

模型验证,需要确保我们收到的接收到的数据是有效的,正确的,使我们可以用这个数据做进一步的处理。 我们可以验证一个动作方法的典范。 内置的验证属性比较,范围,正则表达式,必需的,StringLength。 但是其中我们需要验证比内置的那些属性其他我们可能有方案。

自定义验证属性

public class EmployeeModel 
{
    [Required]
    [UniqueEmailAddress]
    public string EmailAddress {get;set;}
    public string FirstName {get;set;}
    public string LastName {get;set;}
    public int OrganizationId {get;set;}
}

要创建一个自定义的验证属性,你将不得不从ValidationAttribute派生这个类。

public class UniqueEmailAddress : ValidationAttribute
{
    private IEmployeeRepository _employeeRepository;
    [Inject]
    public IEmployeeRepository EmployeeRepository
    {
        get { return _employeeRepository; }
        set
        {
            _employeeRepository = value;
        }
    }
    protected override ValidationResult IsValid(object value,
                        ValidationContext validationContext)
    {
        var model = (EmployeeModel)validationContext.ObjectInstance;
        if(model.Field1 == null){
            return new ValidationResult("Field1 is null");
        }
        if(model.Field2 == null){
            return new ValidationResult("Field2 is null");
        }
        if(model.Field3 == null){
            return new ValidationResult("Field3 is null");
        }
        return ValidationResult.Success;
    }
}

希望这可以帮助。 干杯!

参考

  • 代码项目-自定义验证属性在ASP.NET MVC3
  • Haacked - ASP.NET MVC 2自定义验证


Answer 5:

为了提高Darin的答案,它可以短一些:

public class UniqueFileName : ValidationAttribute
{
    private readonly NewsService _newsService = new NewsService();

    public override bool IsValid(object value)
    {
        if (value == null) { return false; }

        var file = (HttpPostedFile) value;

        return _newsService.IsFileNameUnique(file.FileName);
    }
}

模型:

[UniqueFileName(ErrorMessage = "This file name is not unique.")]

请注意,需要一个错误信息,否则错误将是空的。



Answer 6:

有点晚了回答,但对于谁是搜索。 您可以轻松地通过使用与数据注解额外的属性做到这一点:

public string foo { get; set; }
public string bar { get; set; }

[MinLength(20, ErrorMessage = "too short")]
public string foobar 
{ 
    get
    {
        return foo + bar;
    }
}

这一切都让过真的。 如果你真的想在一个特定的地方,以及显示验证错误,您可以在视图中添加此:

@Html.ValidationMessage("foobar", "your combined text is too short")

在视图这样做可以派上用场,如果你想要做的本地化。

希望这可以帮助!



文章来源: ASP.NET MVC: Custom Validation by DataAnnotation