是否可以在视图模型中的单个属性上使用 2 个远程验证属性?
我想做的是执行 2 次检查,首先是数据库中存在给定的用户 ID,其次是用户尚未在系统上设置帐户。
我想我总是可以制作一个包含两个测试的自定义属性,但如果可能的话,我宁愿只使用开箱即用的功能并将验证链接在一起。
我不能真正将逻辑组合成一个 JsonResult,因为我需要根据验证失败的方式有不同的错误消息,并且 AFAIK 不可能返回带有验证结果的错误消息?
是否可以在视图模型中的单个属性上使用 2 个远程验证属性?
我想做的是执行 2 次检查,首先是数据库中存在给定的用户 ID,其次是用户尚未在系统上设置帐户。
我想我总是可以制作一个包含两个测试的自定义属性,但如果可能的话,我宁愿只使用开箱即用的功能并将验证链接在一起。
我不能真正将逻辑组合成一个 JsonResult,因为我需要根据验证失败的方式有不同的错误消息,并且 AFAIK 不可能返回带有验证结果的错误消息?
实际上,您可以使用 MVC3 远程验证返回一个独特的错误消息。例如,请参阅http://msdn.microsoft.com/en-us/library/gg508808(v=vs.98).aspx或http://deanhume.com/Home/BlogPost/mvc-3-and-远程验证/51。
我不确定您对“开箱即用的功能”有何期望,但您可以创建两个足够简单的属性。在 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 框中连接您的客户端和服务器端验证。