我们正在使用MVC3和 unobstructuve 验证,一切都很好;我们在服务器和客户端上都可以使用自定义验证。
我们还使用内置的asp.net 角色提供程序。我们有特定的观点,我们用于不同的角色。根据登录用户的角色,某些字段(ViewModel的属性)是必需的。
我的问题是:我们如何根据角色制作 ValidationAttribute ?当用户是普通用户时,我们想要一个属性必需;但是当用户是管理员时,我们不希望使该字段成为必需。但我们确实想使用相同的观点。
我知道我们可以创建一个自定义 ValidationAttribute (创建一个派生自 ValidationAttribute 的类)我想这对于服务器端验证会很好。但我们真的想验证这个客户端。
我认为我们在上面的 ValidationAttribute 中实现了 IClientValidatable ,并编写了一些jQuery来向服务器发出Ajax调用,以检查当前登录的用户及其角色。 但这会使我们每次特定属性更改时都会执行Ajax调用,并且登录用户不会更改。
这样做的正确方法是什么?或者我们应该为不同的登录用户创建不同的 ViewModels 吗?
如果我的上述说明没有意义,请告诉我,我可以在需要时添加一些示例代码。
感谢任何帮助。
谢谢,
皮姆
答案 0 :(得分:0)
我认为你确实可以实现一个自定义ValidationAttribute,它也实现了IClientValidatable。但是,您可以为客户端“重用”不显眼的必需验证:
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
if ( <your condition, e.g. if user has a certain role> )
yield return new ModelClientValidationRequiredRule(<error message>);
}
这应该在输入上生成与RequiredAttribute相同的不显眼的必需属性,但仅限于满足条件。