我有一个类设置为在注册表单(VB.NET,MVC)上保存值,并且属性中有一个Password属性:
Public Class RegisterModel
...
Private _password As String
<DisplayName("Password:"), Required(), ValidatePasswordLength(), DataType(DataType.Password)> _
Public Property Password() As String
Get
Return _password
End Get
Set(ByVal value As String)
_password = value
End Set
End Property
这在注册新用户时效果很好,但我想使用同一个类来更新现有用户。 (注意:此应用程序由负责注册个人和分配密码的管理员运行。)我希望它的行为方式是如果管理员将密码留空,则密码不会更改,但其余的的信息是。如果我使用此类,则密码不能留空,因为它在Required()和ValidatePasswordLength()调用上失败。
有没有办法使用这个类但是告诉模型忽略这些特定的验证?即使我将密码字段从我的编辑表单中删除,它仍然会失败。我是否需要在密码字段中创建一个完整的重复类而不受这些限制?必须有更好的方法。
答案 0 :(得分:2)
你可以实现IDataErrorInfo
并在模型上设置一个标志,指示管理员是否正在使用它 - 然后你可以有条件地验证。
但总的来说,我会说这有点代码味道。您将模型用于两个不同的,不兼容的目的。最好使用单独的视图模型。
答案 1 :(得分:1)
我建议使用FluentValidation库。这是分离视图(视图模型)和您想要执行的实际验证的关注点的绝佳方式。您可以将参数传递给它以驱动不同的行为。查看When/Unless条件,或者只使用Must operator编写完整的自定义验证方法。
public class RegisterModelValidator: AbstractValidator<RegisterModel>
{
public RegisterModelValidator(bool isAdmin)
{
RuleFor(x => x.Password).NotEmpty().Unless(isAdmin);
...
}
}
只要视图模型在两种方案中都具有相同的属性,就应该使用一个视图模型和一个验证类。如果模型完全不同,我会使用David推荐的两种视图模型。
答案 2 :(得分:0)
您可以通过两种方式执行此操作:
1:将[ValidateInput(false)]属性添加到操作
或
2:将新属性添加到注册模型
public bool IsNewUser {get;}
3:创建一个新的类级别属性,在验证时将IsNewUser考虑在内