首页 > 解决方案 > 扩展控制器构造函数没有用户实例

问题描述

我有一个从 Controller 扩展的基本控制器,该类工作正常,但我认为我多次使用代码从数据库中获取当前用户。所以我想我应该创建一个构造函数并将我在每个函数中使用的代码移动到那里。基本上,我想做的是为我的控制器中的任何方法准备好参数。

所以,这就是我现在所拥有的(并且工作正常):

public class UsersController : Controller
{
    private DBContext db = new DBContext();

    public ActionResult Info()
    {
        User user = db.Users.Where(m => m.username.Equals(User.Identity.Name)).FirstOrDefault();
        return View(user);
    }

    public ActionResult Edit(int? id){
        User user = db.Users.Where(m => m.username.Equals(User.Identity.Name)).FirstOrDefault();
        if(user.id == id){
            return View(user);
        }
    }
}

但我的想法是创建这样的东西:

public class UsersController : Controller
{
    private DBContext db = new DBContext();
    private User _user;

    public UsersController()
    {
        _user = db.Users.Where(m => m.username.Equals(User.Identity.Name)).FirstOrDefault();
    }

    public ActionResult Info()
    {
        return View(_user);
    }

    public ActionResult Edit(int? id){
        if(_user.id == id){
            return View(_user);
        }
    }
}

当我进行这些更改时,我收到以下错误:

“/”应用程序中的服务器错误。 你调用的对象是空的。

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。

我尝试调试,我发现问题是我Usernull在调用构造函数时,所以我猜测,其他一些语言可以在添加之前或添加自己的自定义之后调用父构造函数,例如这样的:

public function __Construct($x){
    $this->x = $x
    parent::__construct();
}

或者

public function __Construct($x){
    parent::__construct();
    $this->x = $x
}

我尝试在我的程序中做同样的事情,使用base,但似乎没有任何效果,它总是导致我犯一些其他性质的错误。我什至不确定这是不是正确的方法,因为我所需要的只是User在构造函数中创建我的 (Identity)

标签: c#asp.net-mvcinheritanceconstructorextends

解决方案


听起来好像找不到用户,可能是因为在调用控制器的构造函数时,线程主体上没有填充用户身份。

我的建议是避免在构造函数中提取用户数据,而是在需要时获取它。为避免重复代码,您可以编写受保护或私有方法(不是操作方法)来获取它:

public class UsersController : Controller
{
    private DBContext db = new DBContext();

    private User GetCurrentUser()
    {
        return db.Users.Where(m => m.username.Equals(User.Identity.Name)).FirstOrDefault();
    }

    public ActionResult Info()
    {
        var user = GetCurrentUser();
        return View(user);
    }

    public ActionResult Edit(int? id){
        var user = GetCurrentUser();
        if(user.id == id){
            return View(user);
        }
    }
}

推荐阅读