是否可以在视图模型中的单个属性上使用2个远程验证属性?
我希望能够执行2次检查,首先是数据库中存在给定的用户ID,其次是用户尚未在系统上设置帐户。
我想我总是可以创建一个自定义属性,其中包含两个测试,但如果可能的话,我宁愿只使用开箱即用的功能并将验证链接在一起。
我真的无法将逻辑组合成一个JsonResult,因为我需要根据验证失败的方式获得不同的错误消息,而AFAIK无法返回带有验证结果的错误消息?
答案 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).aspx或http://deanhume.com/Home/BlogPost/mvc-3-and-remote-validation/51。