2011-08-30 6 views
3

既存のPage_Loadコードが格納されているASP.NetページのPage_Loadメソッドに、いくつかのコード行を追加しようとしていますコンパイルされたコードビヘイビアDLL。 Dis#を使用してPage_Loadメソッドのコードを抽出することはできますが、DLLのソースにアクセスすることはできません。ASP.Net:コードビハインドの上にPage_Loadのコードを追加します。

新しいコードを追加する最も良い方法は何ですか?既存のPage_Loadコードと新しいコードを一緒に実行する必要があります。実行する順番は関係ありません。

具体的には、Firefox 6で正しく動作しないTelerik RadEditorを使用する古いアプリケーションを修正しています。追加しているコードについては、this pageを参照してください。

答えて

1

ASPX部分にアクセスできる場合は、ASPXにコードブロックを追加し、追加しようとしているコードでうまく動作するOnInitまたはOnPreInitを上書きすることができます。

あなたは他のPageクラスから派生し、 Page.Loadイベントハンドラを追加することができます
<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> 
+0

素晴らしいです、この提案には大変感謝しています。私はOnPreInitの代わりにOnInitを使用しなければなりませんでした。なぜなら、SetValue関数はOnPreInitを使用したときに 'Non-static field requires a target'というエラーを出したからです。私はこれを実行するにはページのライフサイクルで早すぎると思います。 – philwilks

1

あなたは、すべてのソースを展開してコードを追加して、全体のDLLを再構築する必要があります。元のアセンブリを再構築することなくこれを行う方法はありません。元のアセンブリの名前が強い場合、これが問題になります。そうでなければ、それは痛みですが、あなたは大丈夫です。

+1

プラス、それはに便利です実際にソースを持っています。 – mclark1129

+0

私はそれが本当だとは思わない。 ASPXにアクセスできる場合は、OnInitまたはOnPreInitをインラインコードブロックで上書きできます。 –

+0

さて、そうは思わなかった。私はこれをお勧めできないと考え、実際にはソースを変更したいと思っています。また、ViewStateでコントロールのプロパティを上書きできるため、OnPreInitを使用することをお勧めします。 – rtalbot

2

:あなたはDLLからコードを抽出することができた場合は

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

コードビハインドがコンパイルされている場合、どのように追加クラスをアセンブリに挿入できますか? – mclark1129

+0

このクラスを独自のアセンブリに配置し、インスタンス化します(例:このページをご覧ください)。他のコードは継承されているので呼び出されます。 –

+0

また、Inherits/CodeFile属性を新しいページクラスに設定するには、ASPXを変更する必要がありますか? – rtalbot

0

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

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

あるいはOnLoad()を無効にしますそれを解消することで、ページの背後にあるコードの関連付けを解除し、マークアップ内のロジックを再実装することができます。

<%@ 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などのレンダリング方法のいずれか()メソッドをオーバーライドすることができます
0

:あなたはコードベースを維持することで充電している場合

public class Class1 : _Default 
{ 
    protected override void OnPreRenderComplete(EventArgs e) 
    { 
     base.OnPreRenderComplete(e); 
     // add your code here 
    } 
} 
関連する問題