是否可以在单个属性上使用2个远程验证属性?

时间:2011-08-19 16:42:57

标签: asp.net-mvc-3 unobtrusive-validation

是否可以在视图模型中的单个属性上使用2个远程验证属性?

我希望能够执行2次检查,首先是数据库中存在给定的用户ID,其次是用户尚未在系统上设置帐户。

我想我总是可以创建一个自定义属性,其中包含两个测试,但如果可能的话,我宁愿只使用开箱即用的功能并将验证链接在一起。

我真的无法将逻辑组合成一个JsonResult,因为我需要根据验证失败的方式获得不同的错误消息,而AFAIK无法返回带有验证结果的错误消息?

2 个答案:

答案 0 :(得分:1)

我不确定您在“开箱即用”功能方面的期望,但您可以创建两个足够简单的属性。在MVC 3中,您还可以从IValidatableObject派生模型并实现Validate方法。如果您发现需要,后者使您能够在彼此的上下文中对多个属性执行多个验证。

以下是如何实现ValidationAttribute并装饰您的属性的方法。你需要其中两个,所以我将这个命名为UsernameExistsAttribute,我们假装你创建另一个名为AccountAlreadySetupAttribute的方法,覆盖相同的IdValid方法。

public class UsernameExistsAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        if((string)value == "Bob")
            return false;
        else
            return true;
    }
}

在您的视图模型中,您可以像这样装饰属性:

public class FreakinSweetViewModel
{
    [UsernameExists(ErrorMessage="Username exists")]
    [AccountAlreadySetup(ErrorMessage="Account is not setup")]
    public string Username { get; set; }
}

这会将您的客户端和服务器端验证连接到MVC 3框中。

答案 1 :(得分:1)

实际上,您可以使用MVC3远程验证返回一个与众不同的错误消息。例如,请参阅http://msdn.microsoft.com/en-us/library/gg508808(v=vs.98).aspxhttp://deanhume.com/Home/BlogPost/mvc-3-and-remote-validation/51