9

我喜欢 Monkey 修补一个 ASPX 网站,以便我可以在已编译的程序集中向 Page_Load 方法添加内容。

我的第一个想法是将包含第二个 Page_Load 方法的脚本标记添加到 ASPX 文件中,如下所示:

<script language="CS" runat="server">
void Page_Load(object sender, System.EventArgs e) 
{
     // do some stuff in addition to the original Page_Load method
}
</script>

但看起来只有内联代码中的 Page_Load 方法将被执行,而不是来自原始代码隐藏文件(在编译的程序集中)的方法。

是否可以从我的内联代码中调用原始方法?或者是否有任何其他方法可以添加应该在从内联代码中调用 Page_Load 方法后直接运行的内容,而无需修改现有程序集?

4

4 回答 4

10

asp.net 模型是在.aspx 文件中声明的页面实际上是从.aspx.cs 文件中声明的类继承的子类System.Web.UI.Page

因此调用您的 Page_Load 方法是因为它基本上隐藏了原始 Page_Load 方法。按照这个逻辑,你可以这样做:

<script language="CS" runat="server"> 
void Page_Load(object sender, System.EventArgs e)  
{      
   base.Page_Load(sender, e);
   // do some stuff in addition to the original Page_Load method 
} 
</script> 

没有可访问性问题,因为默认情况下 asp.net 声明 Page_Load 和类似的方法,protected以便后代类可以调用它们。

于 2011-07-07T14:46:41.613 回答
3

是的:

void Page_Load(object sender, System.EventArgs e) 
{
     // Do some things before calling the original Page_Load
     base.Page_Load(sender, e);
     // Do some things after calling the original Page_Load
}

这样做的原因是 ASP.Net 框架在 .aspx 文件被编译成一个类的模型上运行,该类继承自代码隐藏文件中定义的类(实际上是由Inherits页面标签上的属性定义的类)

<%@ Inherits="WebApplication1._Default" ... 
于 2011-07-07T14:45:40.103 回答
0

您也可以尝试使用PreLoad方法。那些之前被调用过Page_Load,可能是处理事情的一种更清洁的方式。

于 2011-07-07T14:46:09.023 回答
0

这对我有用。

<script language="CS" runat="server"> 
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        Response.Write("additional stuff");
    } 
</script>
于 2011-07-07T14:52:07.987 回答