3

「サーバー対応」の HTML タグが Web フォームにある場合、次のように --

<p runat="server"/>

-- そのレンダリングにアタッチする方法はありますか? runat="server" を取得したら、何らかのライフサイクルが必要になると思います。

有効になっているHTML タグのレンダリングにコードを追加したいと思います。したがって、テンプレートの作成者がタグに runat="server" を配置するたびに、PreRender (またはその他のもの) をキャッチしてコードを実行できます。

可能?

4

3 に答える 3

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 の使用;

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 (<form runat="server"> を含む runat="server" を含む html タグ) から派生するすべてのコントロールの周りにインライン スタイルを持つ div をレンダリングします。アダプターは、コントロールによってトリガーされる任意のイベントにフックできるため、これでニーズが解決されるはずです。

于 2010-12-30T18:23:21.317 に答える
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);
    }
}
于 2010-12-30T15:08:56.063 に答える
0

ページ ライフサイクルの記事へのリンクは次のとおりです。知っておくべき重要な情報です。

コーディングしている場合は、クラスを作成し、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);
}

これにより、レンダリングの直前に各コントロールをチェックできるようになります。

于 2010-12-30T14:49:57.030 に答える