【问题标题】:When base controller is initialized in MVC在 MVC 中初始化基本控制器时
【发布时间】:2015-08-26 17:05:43
【问题描述】:

我正在开发 MVC 2 中的 Web 应用程序,该应用程序为所有其他控制器使用基本控制器,以将控制器的初始化减少到一个地方。基本控制器包含菜单、当前用户等属性。代码如下:

public class BaseController : Controller 
{
    private Common.MenuHierarchy _menu;
    private User _currentUser;

    internal NavMenuViewModel Menu(string pageId)
    {
        bool isGuest = this.CurrentUser.GroupProfileId == Constant.SecurityGroupProfile.Public;

        if (this._menu == null)
        {
            this._menu = CreateMenu();
        }
    }

    internal User CurrentUser
    {
        get
        {
            if (this._currentUser == null)
            {
                this._currentUser = CreateUser();
            }

            return this._currentUser;
        }
    }
}

所有其他控制器都派生自 BaseController。例如,

public class HomeController : BaseController
{
   ...
}

public ActionResult Index()
{
   // Display home page
   ...
}

我注意到在指向 Home 索引后,_currentUser 属性已被初始化。但是,如果我在 get 中设置 point break,它就不会止步于此。我想知道基本控制器何时初始化。谢谢。

【问题讨论】:

  • 您是否在任何地方呼叫Menu()?如果不是,currentUser 似乎不太可能被初始化。
  • 是的,Menu() 被调用。 currentUser 在被调用之前被初始化。

标签: c# asp.net-mvc


【解决方案1】:

在构建 Home 控制器时,它从 Base 控制器 CTOR 开始,并且正在初始化 _currentUser,之后 HomeController CTOR 正在发生。它没有在 getter 中停止的原因是,没有人得到 CurrentUser。初始化与 getter 是分开的。

【讨论】:

  • 我认为 _currentUser 在创建 Home 控制器时被初始化为 null。仅当为 currentUser 调用 get 时才调用 CreatUser。但是在创建 Home 控制器时(或在执行 Index() 中的第一个命令之后)调用 CreatUser,这很奇怪。
【解决方案2】:

它实际上是在调用 HomeController 构造函数时初始化的。 BaseClass 构造函数首先被调用,然后是派生类构造函数。因此,在您的情况下,它是 BaseController 构造函数,然后是 HomeController 构造函数。尽管您没有在 BaseController 中定义构造函数,但它仍在执行此操作。因此,回答您的问题 BaseController 在创建 HomeController 时正在初始化。

更新:

如果您想知道何时调用动作和其他属性,请尝试将其添加到方法或属性中:

System.Diagnostics.Debug.WriteLine("This will be displayed in output window");

在调试时,您可以看到正在调用的内容以及调用顺序。 这可以帮助您了解 CurrentUser 的初始化时间。

【讨论】:

  • 是的,我知道它在调用 HomeController 构造函数时正在初始化。在这种情况下,我认为 _currentUser 在调用 Home 控制器构造函数时被初始化为 null,并且仅在为 currentUser 调用 get 时才调用 CreatUser。但我注意到,在 Home 控制器的 Index() 中的第一个命令之后,_currentUser 已经创建,这意味着在调用 Home 控制器构造函数时运行 CurrentUser。乔恩,你怎么看?
  • 嗯,除非你在 Index() 操作中调用它否则我错了。
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
  • 1970-01-01
相关资源
最近更新 更多