【发布时间】:2019-05-22 06:33:35
【问题描述】:
我有一个从 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:对象引用未设置为对象的实例。
我尝试调试,我发现问题是我的 User 在调用构造函数时是 null ,所以我猜测,其他一些语言可以在添加自己的自定义之前或之后调用父构造函数,例如:
public function __Construct($x){
$this->x = $x
parent::__construct();
}
或
public function __Construct($x){
parent::__construct();
$this->x = $x
}
我尝试在我的程序中做同样的事情,使用 base,但似乎没有任何效果,它总是导致我出现其他性质的错误。
我什至不确定这是不是正确的方法,因为我所需要的只是在构造函数中创建我的 User(身份)
【问题讨论】:
-
我建议不在这里使用继承。你的建议是每个控制器都应该知道这个用户,或者不知道这个用户。添加
else时会发生什么。然后你有一些了解user的控制器和一些了解else的控制器,但不是两者都知道,因为你不能从 2 个控制器派生。 -
顺便说一句,如果用户未登录
User.Identity或User.Identity.Name为空。 -
用户身份原则直到初始化过程的后期才被填充,因此它在控制器构造函数中不可用。
-
尝试将构造函数更改为 public UsersController() : base()
-
我使用了你的建议 tatmanblue,但它没有用,我猜,它与 Nkosi 所说的有关,我会无法使用继承来完成我想要的。如果我只创建一个私有 void 方法
Init()来定义我的控制器添加的私有变量并在每个方法中调用它会不会很好?不优雅,但我认为它可以完成这项工作。我仍然希望我的变量在我的所有方法中都可用,而不是每次都手动定义它们。
标签: c# asp.net-mvc inheritance constructor extends