簡體   English   中英

C#/ ASP.NET MVC:我設置了屬性的值,但它仍然為null

[英]C#/ASP.NET MVC: I set the property's value, but it's still null

我已經為此奮斗了一個小時,但我不明白為什么會有問題。

我有一個抽象課

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對象傳遞給驗證,以檢查電子郵件是否唯一以及類似的東西。

這是初始化數據庫的方式:

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
    base.Initialize(requestContext);
    DB = new MyDataContext();
} 

DB屬性是在Register方法中設置的,我對此進行了調試。 但是在類的IsValid方法中它為null ...

更新

看起來由於某種原因,MVC框架在Register ActionResult之前(並且在初始化DB對象之前)運行IsValid方法。 我認為這是因為它通過將RegisterModel參數傳遞給視圖來完成所有“魔術”工作。 所以我就放

if (DB != null)

它有所幫助。

顯然,當調用IsValid方法時,它將再次運行,並且此時DB對象不為null。

更新2

由於IsValid是屬性,因此ASP.NET MVC對其進行了綁定,將其轉換為方法后,問題就消失了。

您可能需要將IValidated重命名為ValidationBase或其他名稱I前綴表示接口而不是基類。

是否在控制器的構造函數中設置了DB 我猜不是,這導致Register方法為model.DB分配了空引用,這導致您的NullReferenceException

同樣, MVC2將在數據綁定期間讀取屬性以嘗試驗證它們 那可能就是在咬你。 如果將IsValid從屬性更改為方法,問題將消失。

您在哪里創建實例變量數據庫?

model.DB = DB

正確的數據庫在哪里初始化?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM