2011-10-02 103 views
2

我是新来的MVC所以这个问题可能很幼稚asp.net MVC3自定义验证

我知道你可以添加验证属性的属性模型和框架将提供相应的服务器端和客户端validation.However我被迫使用遗留数据库结构,其中模型中的一个属性是“int”或“string” ,而其他属性(值)数据类型由第一个属性确定。这意味着我不能使用注释进行验证。但是,在从数据库中提取值并构建模型类之后,是否有任何编程方式“注释”属性的简单方法?如果可以这样做,那么它将毫无麻烦地进行有效的(客户端)验证。 谢谢

回答

3

This answer显示了一种在运行时注入属性的方法。 Another answer显示了如何使用仅有时检查的验证。

在你的情况下,很容易做基于模型的验证。

对于服务器端验证:

public class MyModel: IValidatableObject 
{ 
    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 

    public IEnumerable<ValidationResult> 
     Validate(ValidationContext validationContext) 
    { 
     var relevantFields = new [] {"Prop2"}; 
     if (Prop1 == "Int" && NotValidInt(Prop2)) 
      yield return new ValidationResult("Prop2 must be convertable to int", relevantFields); 
     else if (prop1 == "String" && NotValidString(Prop2)) 
      yield return new ValidationResult("Prop2 must be convertible to string", relevantFields); 
    } 
} 

对于客户端验证,这有点更复杂,但详细信息,请点击这里:

有关服务器端验证的更多信息,请参阅免费Pluralsight training on validation的自定义验证部分。

2

你陷入了数据库思维的正常新手错误,就像MVC中的M一样。任何不平凡的应用程序都将要求您从视图模型中分离数据库模型。因此,将您的属性应用于视图模型,然后在视图正确验证时使用业务逻辑将值复制到数据库模型。

MVC是一种用户界面模式,数据库不属于它...我知道,太阳下的每个示例应用程序都将您的数据对象传递给视图,但这不是它应该完成的方式。