C#/ ASP.NET MVC:我设置了属性的值,但它仍然是null

时间:2010-08-16 14:29:58

标签: c# asp.net-mvc abstract-class

我一直在为此奋斗一个小时,我不明白为什么会出现问题。

我有一个抽象类

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绑定它,在将其转换为方法后,问题就消失了。

2 个答案:

答案 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

正确的数据库初始化在哪里?