为什么控制器构造函数在Initialize方法之前触发

时间:2011-05-18 19:34:10

标签: asp.net-mvc

我有一个基本控制器ApplicationController,需要抓取URL主机并在触发子控制器之前进行一些处理。由于在初始化RequestContext之前触发了控制器构造函数,因此我必须重写Initialize方法来进行处理。

ApplicationController:

    Protected Overrides Sub Initialize(ByVal requestContext As System.Web.Routing.RequestContext)
        MyBase.Initialize(requestContext)

        Dim host as String
        host = Request.Url.Host.ToString
    End Sub

在Initialize方法之前激活Controller Constructors背后的逻辑是什么?

还应该在Initialize Method中放置什么规则。

2 个答案:

答案 0 :(得分:11)

假设构造函数是第一个在.NET类中被触发的实例方法,那不应该是一个惊喜,并不是MVC特有的东西。它更像是.NET框架的工作方式。

MVC框架需要首先实例化一个控制器,然后初始化它=>它首先调用构造函数。并且因为执行大量可能会抛出异常等的代码...并不总是最好放在构造函数中=>存在Initialize方法。就这个方法而言,我必须承认我已经写了很多ASP.NET MVC代码而且从来没有使用它。动作过滤器似乎总是更好的选择。

所以回答你的问题:

  

还应该在Initialize Method中放置什么规则。

我从未放过任何代码,也从未需要覆盖此方法。我总是喜欢使用动作过滤器,因为这样我不再有义务从公共基本控制器派生(不是这是一个问题)。

答案 1 :(得分:-1)

有时,您可能希望自己的请求初始化变量,因此在这种情况下,您应该使用初始化方法

例如,如果您想在请求是本地的时候以不同的方式初始化某些变量,等等。