2010-12-30 4 views
3

「サーバー対応の」HTMLタグはこのように、Webフォームである場合 -サーバー対応HTMLタグのライフサイクルに自動的に添付することはできますか?

<p runat="server"/> 

- 私はそのレンダリングに接続するためにどのような方法はありますか?私は彼らがrunat = "server"を持っていれば、彼らはある種のライフサイクルを持っていなければなりません。

HTMLタグのレンダリングにいくつかのコードを付けたいと思います。したがって、テンプレート作成者がrunat = "server"をタグに置くと、PreRender(または他のもの)をキャッチしてコードを実行できます。

可能ですか?

+0

もちろん、コントロールの開発者のために、各コントロールに添付されているOnPreRenderがあります。私はどこに/どのようにあなたがそれに添付したいと思うか分からないのですか?あなたは、IISレベルのハンドラのいくつかのタイプを作成し、ページリクエストや何を調べることができると思いますか? – phillip

+0

サーバー対応HTMLタグのPreRenderで実行されるいくつかの共通コードが必要です。私は手動でそれをそれぞれに付ける必要はありません。 – Deane

答えて

0

私はこれが私が探していると思います。それは再帰的にコントロールツリー全体を反復処理し、HtmlControlが見つかるとイベントハンドラをバインドします。

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

private void BindTagProcessor(Control control) 
{ 
    foreach (Control childControl in control.Controls) 
    { 
     if (childControl is HtmlControl) 
     { 
      ((HtmlControl)childControl).PreRender += new EventHandler(MyTagProcessor);     
     } 
     BindTagProcessor(childControl); 
    } 
} 
0

ここにはpage lifecycle articleへのリンクがあります。それは知るべき重要な情報です。

もしあなたがそれをコーディングしていれば、クラスを作成し、PreRenderを内部で必要なものをオーバーライドすることができます。コントロールがそのクラスを実装します。

さらに一般的なアプローチを希望する場合は、同じことをページレベルで行うことができます。次のようなページレベルでOnPreRenderフックができます:あなただけのレンダリングの前に、各コントロールをチェックする機能を与える必要があります

private void Page_PreRender(object sender, System.EventArgs e) 
{ 
    Page page = sender as Page; 
    if (page != null) 
    { 
     page.Controls.Clear(); // Or do whatever u want with ur page... 
    } 
} 

private void InitializeComponent() 
{  
    // Handle the Page.PreRender event. 
    this.PreRender += new System.EventHandler(this.Page_PreRender); 
} 

を。

+1

'InitializeComponent'はビルトインメソッドではないので、どこからでも呼び出す必要があります。 'Page_Load'を呼び出すので、' AutoEventWireup = true'が必要です。暗黙のイベントサブスクリプションなしで 'Page_PreRender'だけが必要です。 – abatishchev

+0

私はそれが3.5で始まったと信じていますが間違っている可能性があります...私はあなたに良い情報のポイントを与えました。 :) – phillip

2

これはアダプターを使用して行われます。その魔法を行うものを作成し、それをApp_Browsersに含まれるブラウザファイルに関連付けます。ここで

は私の実験App_Browsers/Default.browser

<browsers> 
    <browser refID="Default"> 
    <controlAdapters> 
     <adapter controlType="System.Web.UI.HtmlControls.HtmlControl" 
       adapterType="App_Code.Adapters.HtmlControlAdapter" /> 
    </controlAdapters> 
    </browser> 
</browsers> 

そして、私のアダプタ...たSystem.Web.UIを使用して

の例です。 System.Web.UI.Adaptersを使用しています。 superfragilicious能力を持つ

using System.Web.UI; 
using System.Web.UI.Adapters; 

namespace App_Code.Adapters { 
    public class HtmlControlAdapter : ControlAdapter { 
     protected override void Render(HtmlTextWriter writer) { 
      writer.Write("<div style='background-color: #f00;'>"); 
      base.Render(writer); 
      writer.Write("</div>"); 
     } 
    } 
} 

私の高度なアダプタがHtmlControlから派生するすべてのコントロールの周りにインラインスタイル(<フォームにrunat = "サーバー" を含む、runat = "server" を使用し、HTMLタグ、>)とのdivをレンダリングします。あなたのアダプターは、コントロールによってトリガーされたイベントにフックすることができます。

関連する問題