ASP.Net:在代码隐藏的基础上,向Page_Load添加其他代码

时间:2011-08-30 18:03:52

标签: c# .net asp.net

我正在尝试向ASP.Net页面的Page_Load方法添加一些额外的代码行,其中现有的Page_Load代码存储在已编译的代码隐藏DLL中。虽然我可以使用Dis#提取Page_Load方法的代码,但我无法访问DLL的源代码。

添加新代码的最佳方法是什么?我需要现有的Page_Load代码与新代码一起执行,并且它们执行的顺序无关紧要。

具体来说,我正在修复使用Telerik RadEditor的旧应用程序,该应用程序在Firefox 6下无法正常工作。有关我正在添加的确切代码,请参阅this page

6 个答案:

答案 0 :(得分:2)

您可以从其他Page类派生并添加Page.Load事件处理程序:

public class YourPage : TheirPage
{
  public YourPage() { Load += YourPage_Load; }

  void YourPage_Load(object s, EventArgs e) { ... }
}

甚至覆盖OnLoad()

protected override void OnLoad(EventArgs e)
{
  base.OnLoad(e);
  ...
}

答案 1 :(得分:1)

您需要提取所有源代码,添加代码并重建整个dll。没有重建原始程序集就没有办法做到这一点。如果原始程序集具有强名称,则会出现问题。否则,这很痛苦,但你应该没事。

答案 2 :(得分:1)

如果您可以访问ASPX部分,您可以尝试向ASPX添加代码块,并覆盖OnInit或OnPreInit,这对于您尝试添加的代码应该可以正常工作。

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

        if (Request.Browser.Browser.ToLowerInvariant() == "firefox")
        {    
            System.Reflection.FieldInfo browserCheckedField = typeof(RadEditor).GetField("_browserCapabilitiesRetrieved", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);    
            browserCheckedField.SetValue(RadEditor1, true);    

            System.Reflection.FieldInfo browserSupportedField = typeof(RadEditor).GetField("_isSupportedBrowser", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);    
            browserSupportedField.SetValue(RadEditor1, true);
        }                        
    }
</script>   

答案 3 :(得分:0)

你可以在aspx页面中挂钩PreLoad吗?此时加载控件,您应该能够执行所需的操作。有时需要额外的处理,你可以挂钩到LoadComplete,我觉得这可能对你有用吗?

http://msdn.microsoft.com/en-us/library/system.web.ui.page.preload.aspx

http://msdn.microsoft.com/en-us/library/system.web.ui.page.onloadcomplete.aspx

答案 4 :(得分:0)

如果您可以通过对其进行分解来从DLL中提取代码,则可以取消关联页面后面的代码并重新实现标记中的逻辑。

<%@ Page Language="C#" AutoEventWireup="true"  %>

<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
    lblTest.Text = "Something here";
}
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org    /TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
    <asp:Label ID="lblTest" runat="server" ></asp:Label>
</div>
</form>
</body>
</html>

答案 5 :(得分:0)

您可以从现有类派生并覆盖任何渲染方法,例如OnPreRender()方法:

public class Class1 : _Default
{
    protected override void OnPreRenderComplete(EventArgs e)
    {
        base.OnPreRenderComplete(e);
        // add your code here
    }
}