我通过子类化ValidationAttribute创建了一个自定义验证属性。该属性在类级别应用于我的 View 模型,因为它需要验证多个属性。

我压倒一切

protected override ValidationResult IsValid(object value, ValidationContext validationContext)

然后返回:
new ValidationResult("Always Fail", new List<string> { "DateOfBirth" });

在DateOfBirth是我的 View 模型上的属性之一的所有情况下。

当我运行我的应用程序时,我可以看到它被击中了。 ModelState.IsValid正确设置为false,但是当我检查ModelState内容时,我看到属性DateOfBirth不包含任何错误。取而代之的是,我有一个空字符串Key,值是null,还有一个异常,其中包含我在我的验证属性中指定的字符串。

使用ValidationMessageFor时,这不会在我的UI中显示任何错误消息。如果我使用ValidationSummary,则可以看到该错误。这是因为它不与属性关联。

似乎忽略了我在验证结果中指定了成员名称的事实。

为什么会这样,我该如何解决?

要求的示例代码:
 [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
    public class ExampleValidationAttribute : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            // note that I will be doing complex validation of multiple properties when complete so this is why it is a class level attribute
            return new ValidationResult("Always Fail", new List<string> { "DateOfBirth" });
        }
    }

    [ExampleValidation]
    public class ExampleViewModel
    {
        public string DateOfBirth { get; set; }
    }

最佳答案

我不知道解决此问题的简便方法。这就是我讨厌数据注释的原因之一。对FluentValidation进行相同的操作将使您大吃一惊:

public class ExampleViewModelValidator: AbstractValidator<ExampleViewModel>
{
    public ExampleViewModelValidator()
    {
        RuleFor(x => x.EndDate)
            .GreaterThan(x => x.StartDate)
            .WithMessage("end date must be after start date");
    }
}

FluentValidation具有出色的support and integration with ASP.NET MVC

关于asp.net-mvc - 无法从MVC2中的自定义验证属性设置成员名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4266632/

10-10 03:19