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

时间:2014-08-04 11:22:18

标签: c# asp.net-mvc validation viewmodel validationattribute

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

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,因为我无法访问我系统中任何其他地方设置它的内容;

我也无法在IsLive/MessageResource/MessagePrefix中私下设置MyCustomValidator,因为我的自定义验证程序内容是通用的,MessagePrefixMessageResource可在我的所有自定义验证程序中访问。

2 个答案:

答案 0 :(得分:1)

很抱歉,但这是不可能的。必须在编译时知道属性的构造函数参数,因为它们用作类型或方法的元数据 NOT 每个调用或实例将使用的内容。

答案 1 :(得分:0)

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