2010-08-16 49 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

相關問題