我一直在为此奋斗一个小时,我不明白为什么会出现问题。
我有一个抽象类
public abstract class IValidated
{
public bool IsValid { get { return (GetRuleViolation() == null); } }
public abstract RuleViolation GetRuleViolation();
}
验证类
public class RegisterModel : IValidated
{
public string Name { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public MyDataContext DB { get; set; }
// ....
}
当我使用验证时,我收到错误
public ActionResult Register(RegisterModel model)
{
model.DB = DB;
if (model.IsValid) // an exception here
}
DB为空!我需要将datacontext对象传递给验证,以检查电子邮件是否是唯一的以及类似的东西。
以下是DB的初始化方式:
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
base.Initialize(requestContext);
DB = new MyDataContext();
}
DB属性在Register方法中设置,我调试了它。但是在类的IsValid方法中它是空的......
更新
看起来MVC框架由于某种原因在Register ActionResult之前(以及在初始化DB对象之前)运行IsValid方法。我认为这是因为它通过将RegisterModel参数传递给视图来做所有“神奇”的事情。所以我只是把
if (DB != null)
并且它有所帮助。
显然,当 I 调用它时,IsValid方法再次运行,到那时DB对象不为null。
更新2
由于IsValid是一个属性,ASP.NET MVC绑定它,在将其转换为方法后,问题就消失了。
答案 0 :(得分:2)
您可能希望将IValidated
重命名为ValidationBase
或其他内容 - I
前缀表示接口而非基类。
是否在控制器的构造函数中设置了DB
?我猜它不是,这会导致Register
方法为model.DB
分配一个空引用,从而导致NullReferenceException
。
此外,MVC2 will read properties during databinding to try to validate them。那可能就是在咬你。如果您将IsValid
从属性更改为方法,问题就会消失。
答案 1 :(得分:1)
您在哪里创建实例变量DB?
model.DB = DB
正确的数据库初始化在哪里?