如何将视图模型数据传递给ValidationAttribute

本文关键字:ValidationAttribute 数据 模型 视图 | 更新日期: 2023-09-27 18:16:11

所以我有一个简单的自定义验证属性:

public class MyCustomValidator : CustomValidationAttribute
{
    public bool IsLive { get; set; }
    public MyCustomValidator()
    {
        //Service locator stuff
    }
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        return ValidationResult.Success;
    }
}

MyCustomValidor继承了下面的类,因为我所有的自定义验证器都需要访问它。

public abstract class CustomValidationAttribute : ValidationAttribute
{
    public Type MessageResource { get; set; }
    public string MessagePrefix { get; set; }
}

然后我在viewModel中调用它它看起来像这样:

public class MyViewModel
{
    private static bool IsWebLive;
    [MyCustomValidator(IsWebLive = IsWebLive, MessageResource = typeof(MyResourceFile), MessagePrefix = "ErrorMessage")]
    public string SampleValue { get; set; }
}

在我将私有IsWebLive传递到validator的地方,我得到一个错误说an attribute argument must be a constant expression, typeof expression or array.我知道我可能做错了。但是我怎么能把这个bool传递到Validator,因为我无法访问系统中其他任何地方的设置;

我也不能在MyCustomValidator中私下设置IsLive/MessageResource/MessagePrefix,因为我的自定义验证器的东西是通用的,MessagePrefixMessageResource可以在我所有的自定义验证器中访问。

如何将视图模型数据传递给ValidationAttribute

对不起,这是不可能的。属性的构造函数参数必须在编译时已知,因为它们被用作类型或方法上的元数据,而不是将在每次调用或实例中使用的东西。

您可以做的就是简单地使用CustomValidationAttribute,为它提供一个静态方法来执行验证。当调用静态方法时,您提供的参数之一将是验证上下文,它将在ObjectInstance属性下包含视图模型中的所有属性。例如,你可以让IsWebLive在静态方法中做条件测试。不需要继承,也不需要IsLive属性

相关文章:
  • 没有找到相关文章