簡體   English   中英

ASP.Net:在代碼隱藏的基礎上,向Page_Load添加其他代碼

[英]ASP.Net: Add additional code to Page_Load, on top of what is in codebehind

我正在嘗試向ASP.Net頁面的Page_Load方法添加一些額外的代碼行,其中現有的Page_Load代碼存儲在已編譯的代碼隱藏DLL中。 雖然我可以使用Dis#提取Page_Load方法的代碼,但我無法訪問DLL的源代碼。

添加新代碼的最佳方法是什么? 我需要現有的Page_Load代碼與新代碼一起執行,並且它們執行的順序無關緊要。

具體來說,我正在修復一個使用Telerik RadEditor的舊應用程序,該應用程序在Firefox 6下無法正常工作。請參閱此頁面以獲取我正在添加的確切代碼。

您可以從其他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);
  ...
}

您需要提取所有源代碼,添加代碼並重建整個dll。 沒有重建原始程序集就沒有辦法做到這一點。 如果原始程序集具有強名稱,則會出現問題。 否則,這是一個痛苦,但你應該沒問題。

如果您可以訪問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>   

你可以在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

如果您可以通過對其進行分解來從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>

您可以從現有類派生並覆蓋任何呈現方法,例如OnPreRender()方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM