我的 BaseController 上有一个名为 DataContext 的属性,它保存我的 LINQ to SQL 数据上下文(或用于测试的假上下文)。使用无参数构造函数时(换句话说,当向 ASP.NET MVC 发出请求时),我的 LINQ to SQL 数据上下文的新实例被分配给属性:
public class BaseController : Controller {
public IDataContextWrapper DataContext { get; set; }
public BaseController() : this(new DataContextWrapper<MyDataContext>()) { }
public BaseController(IDataContextWrapper context) {
DataContext = context;
}
}
同样在我的 BaseController 中,我设置了一些全局 ViewData 项:
protected override void OnActionExecuting(ActionExecutingContext filterContext) {
ViewData["Example"] = DataContext.Table<Example>().Count();
base.OnActionExecuting(filterContext);
}
这几乎适用于所有操作。唯一不起作用的是我的 AccountController 上的 Logout 操作:
public ActionResult Logout() {
FormsAuth.SignOut();
return RedirectToResult("Login");
}
这会在 BaseController.OnActionExecuting 期间引发 NullReferenceException。执行该特定操作时,DataContext 属性为空。
为什么这只发生在一个动作上?
注意: IDataContextWrapper 和 DataContextWrapper 只是包装了 LINQ to SQL DataContext 对象的现有功能,以便在单元测试中可以用假上下文替换它。它自己不会进行任何处理,而是将其留给底层的 DataContext,所以我很确定这不是问题所在。