0

リピーター コントロール内から ItemTemplate の生のマークアップを読み取ることができるかどうかを知りたいですか?

以下のリピーターを検討してください。

<asp:Repeater ID="uiReport" runat="server" EnableViewState="False">
    <HeaderTemplate>
        <table border="1">
            <thead>
                <tr>
                    <th>Product</th>
                </tr>
            </thead>
            <tbody>
    </HeaderTemplate>
    <ItemTemplate>
        <tr>
            <td><%#((Product)Container.DataItem).ProductName%></td>
        </tr>
    </ItemTemplate>
    <FooterTemplate>
        </tbody></table>
    </FooterTemplate>
</asp:Repeater> 

項目テンプレートを生の文字列形式で読み取ろうとしています。たとえば、次のような文字列として読み込もうとしています。

string itemTemplate = "<tr><td><%#((Product)Container.DataItem).ProductName%></td></tr>"

Reflector を使用してコール スタックを調べると、以下のコール スタック画面のグラブに従って、次のメソッドにたどり着きました (強調表示された最初の行を参照)。

コール スタック

...__BuildControl__control6()...内から、.aspx ページのマークアップの生のコンテンツが読み取られ、切り刻まれ (RegEx?)、パラメーターとして以下のメソッドに渡されると想定しています。

System.Web.UI.DataBoundLiteralControl.SetStaticString(index, s);

この例のリピーター コントロールでは、's' (文字列) パラメーターの値は次のとおりです。

\r\n                <tr>\r\n                    <td>

<%# の最初のインスタンスで文字列が分割されていることに注意してください。

MSDN 検索では、SetStaticString メソッドが .NET Framework インフラストラクチャをサポートしており、コードから直接使用することを意図していないことが確認されています。

http://msdn.microsoft.com/en-us/library/system.web.ui.databoundliteralcontrol.setstaticstring.aspx

生のテンプレート マークアップを取得できる仮想メソッドが不足していますか、それともファイルの内容を自分で読み取り (以下のコード例) 、Control 基本クラスの必要なRender()メソッドをオーバーライドする唯一のオプションですか?

.aspx ページのコンテンツを手動で読み取るコードの詳細な例:

string rawPageMarkUp = File.ReadAllText(physicalPathOfAspxPage);
string rawItemTemplate = RegExMethodToExtractItemTemplateFromControl(controlName, rawPageMarkUp);
4

1 に答える 1

0

答えはノーのようです。解析されていないページを取得するために使用できる仮想メソッドはありません。ページ/コントロールの解析を処理するメソッドは、封印されたクラスと内部メソッドで構成されています。

この問題の解決策は、質問に記載されている代替提案です。

クラスの詳細を以下に示します。これにより、ネイティブ実装を確認して、コードがどのように見えるべきかについてのアイデアを得ることができます。

以下の封印されたクラスから始めます。

System.Web.UI.PageParser

これは抽象クラスから継承します:

System.Web.UI.TemplateControlParser

このクラスは、次の名前のメソッドを継承します。

ParseFile

以下に到達するまで、継承されたクラスに従います。

System.Web.UI.TemplateParser

raw ファイルの読み取りとコンテンツの解析の開始点を含むメソッドがここにあります。

internal void ParseFile(string physicalPath, VirtualPath virtualPath)
{
    string o = (physicalPath != null) ? physicalPath : virtualPath.VirtualPathString;
    if (this._circularReferenceChecker.Contains(o))
    {
        this.ProcessError(SR.GetString("Circular_include"));
    }
    else
    {
        this._circularReferenceChecker.Add(o);
        try
        {
            StreamReader reader;
            if (physicalPath != null)
            {
                using (reader = Util.ReaderFromFile(physicalPath, base.CurrentVirtualPath))
                {
                    this.ParseReader(reader, virtualPath);
                    return;
                }
            }
            using (Stream stream = virtualPath.OpenFile())
            {
                reader = Util.ReaderFromStream(stream, base.CurrentVirtualPath);
                this.ParseReader(reader, virtualPath);
            }
        }
        finally
        {
            this._circularReferenceChecker.Remove(o);
        }
    }
}
于 2012-08-13T12:51:23.860 に答える