在MVC中初始化基本控制器时

时间:2015-06-11 06:38:50

标签: c# asp.net-mvc

我正在开发一个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属性已经初始化。但如果我在里面设置点数突破,它就不会止步于此。我想知道何时初始化基本控制器。感谢。

2 个答案:

答案 0 :(得分:2)

当构建Home控制器时,它从基本控制器CTOR开始,_currentUser正在初始化,之后HomeController CTOR正在进行。它没有在吸气剂中停止的原因是,没有人得到CurrentUser。初始化与getter分开。

答案 1 :(得分:1)

实际上,在调用HomeController构造函数时,它实际上已被初始化。 BaseClass构造函数首先被调用然后派生类构造函数。所以在你的情况下它是BaseController构造函数然后是HomeController构造函数。虽然你没有在BaseController中定义构造函数,但它仍然在做它。所以回答你的问题在创建HomeController时初始化BaseController。

更新:

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

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

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