2009-08-12 5 views
0

通常のhtml、いくつかのuicomponents、および{tokenname}という形式の複数のトークンを含むaspxページがあります。ロード時にaspxページのトークンを置換する

ページが読み込まれると、ページコンテンツを解析し、これらのトークンを正しいコンテンツに置き換えます。アイデアは、同じコードビハインドを使用する複数のテンプレートページが存在することです。

私は最善の方法は何

...私のトラブルが読むことをするときであり、そしてどのように戻ってページにデータを書き込む(named string formattingreplace tokens in templateを参照)、支障文字列データそのものを解析をしたん私はページの内容を書き換えることができますか?私はストリームリーダを使用して、Response.Writeでページを置き換えていますが、これはうまくありません。他の.netコンポーネントを含むページが正しくレンダリングされません。

ご意見をいただければ幸いです!

答えて

0

多くのおかげで、しかし、私は別のソリューションを使用して終了しました。

protected override void Render(HtmlTextWriter writer) 
    { 
     if (!Page.IsPostBack) 
     { 
      using (System.IO.MemoryStream stream = new System.IO.MemoryStream()) 
      { 
       using (System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(stream)) 
       { 
        HtmlTextWriter htmlWriter = new HtmlTextWriter(streamWriter); 
        base.Render(htmlWriter); 
        htmlWriter.Flush(); 
        stream.Position = 0; 
        using (System.IO.StreamReader oReader = new System.IO.StreamReader(stream)) 
        { 
         string pageContent = oReader.ReadToEnd(); 
         pageContent = ParseTagsFromPage(pageContent); 
         writer.Write(pageContent); 
         oReader.Close(); 
        } 
       } 
      } 
     } 
     else 
     { 
      base.Render(writer); 
     } 
    } 

ここで正規表現タグパーサ

private string ParseTagsFromPage(string pageContent) 
    { 
     string regexPattern = "{zeus:(.*?)}"; //matches {zeus:anytagname} 
     string tagName = ""; 
     string fieldName = ""; 
     string replacement = ""; 
     MatchCollection tagMatches = Regex.Matches(pageContent, regexPattern); 
     foreach (Match match in tagMatches) 
     { 
      tagName = match.ToString(); 
      fieldName = tagName.Replace("{zeus:", "").Replace("}", ""); 
      //get data based on my found field name, using some other function call 
      replacement = GetFieldValue(fieldName); 
      pageContent = pageContent.Replace(tagName, replacement); 
     } 
     return pageContent; 
    } 

だGetFieldValue関数内で自分のフィールド名は、あなたが望む任意の方法で使用することができるよう、非常にうまく動作するようです。

1

System.Web.UI.Adapters.PageAdapterメソッドを見てください。TransformText - 通常はマルチデバイスサポートに使用されますが、これでページを後処理することができます。

1

私はあなたが

<%$ ZeusExpression:tokenname %> 

のようなものに

{tokenname} 

から、あなたの表記を変更することができれば、あなたが作成することを検討でき 私はあなたの質問に答えるてるかどうかわからないんだけど、...あなたのSystem.Web.Compilation.ExpressionBuilderただ...式を作成します。

あなたのコメントを読んだ後...

はExpressionBuilderのを使用して、現在のページへのアクセスを得るための他の方法があります。あなたはこの

public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context) 
{ 
    Type type1 = entry.DeclaringType; 
    PropertyDescriptor descriptor1 = TypeDescriptor.GetProperties(type1)[entry.PropertyInfo.Name]; 
    CodeExpression[] expressionArray1 = new CodeExpression[1]; 
    expressionArray1[0] = new CodePrimitiveExpression(entry.Expression.Trim()); 

    return new CodeCastExpression(
     descriptor1.PropertyType, 
     new CodeMethodInvokeExpression(
      new CodeThisReferenceExpression(), 
      "GetData", 
      expressionArray1)); 
} 

のようなものを実装することができ;-) MSDNからのサンプルだけビットを変更すると、ページのコードを想定したが、この

public object GetData(string token); 

のような方法が含まれているこれは、Aとプレースホルダを置き換えますあなたはおそらく、単純化し、データへのアクセス(Aを「守る」ために、「ユーティリティメソッド」を使用して、この上ではるかに詳しく説明することができます。もちろん、この

(string)this.GetData("tokenname"); 

のように呼び出しますプロパティへのアクセス、特別なメソッドの使用、エラー処理など)。 (例えば)

(string)Utilities.GetData(this, "tokenname"); 

・ホープ、このことができますと代わりに置き換え

何か。私は正規表現を使用して、複数の異なるタグのページの内容を解析された以外、this pageあたりとしてレンダリング機能をオーバーライド

- この質問に貢献しているものに

+0

これは非常に興味深い解決策です。入力のためにありがとう:) 問題現在のページから表現ビルダーに物事を渡すことができるかどうかわからない、置換テキストをレンダリングするために現在のページからデータが必要ですか? 私はちょうど解決策を実際に見つけました...おそらく、他人が疑問に思うような場合に私自身の質問に答えるべきです。 – RYFN

+0

はい、あなた自身の解決策を提示する必要があります。とにかく私はあなたの懸案事項のいくつかに答えるように私の提案を編集しました。 –

関連する問題