2010-08-16 48 views
0

我一直在努力争取一个小时,我不明白为什么会有问题。C#/ ASP.NET MVC:我设置了属性的值,但它仍然为空

我有一个抽象类

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属性在注册方法设置,我调试这一点。但在它的空类的IsValid的方法...

UPDATE

看起来像某种原因MVC框架运行注册的ActionResult前的IsValid方法(和DB对象初始化之前)。我认为这是因为它通过将RegisterModel参数传递给视图来完成所有“魔术”功能。所以我只是把

if (DB != null) 

它有帮助。

很明显,IsValid方法在调用它时再次运行,到那时DB对象不为空。

UPDATE 2

由于是的IsValid一个属性,ASP.NET MVC被结合它,把它变成一个方法后,该问题消失。

+0

我认为我们缺少部分图片。我没有看到示例代码中的任何内容,表明为什么您期望DB不*为空。另外,“RegisterModel”上的'GetRuleViolation()'实际上是做什么的? – Toby 2010-08-16 14:36:49

+0

为什么初始化方法而不是构造函数? – 48klocs 2010-08-16 14:40:32

+0

@ 48klocs我无法访问构造函数中的RouteData或ViewData。 – Alex 2010-08-16 14:54:35

回答

2

您可能想要将IValidated重命名为ValidationBase或其他 - I前缀表示接口而不是基类。

DB是否在您的控制器的构造函数中设置?我猜这不是,这导致Register方法分配一个空引用model.DB,这导致您的NullReferenceException

另外,MVC2 will read properties during databinding to try to validate them。这可能是什么咬你。如果将IsValid从属性更改为方法,问题将消失。

+0

你是对的,即使我在Register方法中创建它,DB对象也是null。根据调试器,错误发生在运行Register方法之前,所以IsValid方法在加载ActionResult之前运行!这就是为什么DB是空的,我不知道如何解决这个问题。 – Alex 2010-08-16 14:59:20

+0

感谢您的支持!我把IsValid变成了一个方法,并且工作正常。现在我明白了为什么发生了。 再次感谢。 – Alex 2010-08-16 15:11:45

1

你在哪里创建实例变量DB?

model.DB = DB 

DB正在初始化的地方在哪里?

+0

好问题。第一篇文章已更新。 – Alex 2010-08-16 14:37:23