asp.net MVC3自定义验证

时间:2011-10-02 11:42:22

标签: asp.net asp.net-mvc-3

我是MVC的新手,所以这个问题可能很天真

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

2 个答案:

答案 0 :(得分: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的自定义验证部分。

答案 1 :(得分:2)

您正在考虑将您的数据库视为MVC中的M的正常新手错误。任何非平凡的应用程序都要求您从视图模型中分离数据库模型。因此,将您的属性应用于视图模型,然后在正确验证视图时使用业务逻辑将值复制到数据库模型。

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