创建不需要的必需类属性

时间:2011-04-08 15:42:07

标签: asp.net-mvc vb.net model-view-controller validation

我有一个类设置为在注册表单(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()调用上失败。

有没有办法使用这个类但是告诉模型忽略这些特定的验证?即使我将密码字段从我的编辑表单中删除,它仍然会失败。我是否需要在密码字段中创建一个完整的重复类而不受这些限制?必须有更好的方法。

3 个答案:

答案 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考虑在内