2017-10-28 15 views
0

すべてのページで動的な顧客固有のテキスト置換を行うことができるという要件があります。たとえば、私は「{CarMake}」をページのどこにでも置くことができ、フォードのお客様は「CarMake」を「Ford」、トヨタは「Toyota」などに変更します。カスタムPage.Render関数は、クライアントに出力される直前にレンダリングされたhtmlの置換を行います。PageRequestManagerParserErrorException - カスタムPage.Renderを使用したUpdatePanel

カスタムPage.Renderは基本的にレスポンスフィルタと同じアイデアですが、私は既にEilon Lipton's fantastic explanation of this errorを読んでいますが、これは私の特定のケースでなぜこれが問題なのか混乱しています。

.aspxページのマークアップは、UpdatePanelの中​​に含まれています

<p>{CarMake}</p> 

次にロードされたページのレンダリングされたHTMLが含まれています

<p>Ford</p> 

その後、UpdatePanelのは、部分的なポストバックをしたときに、私は(HTMLの初期レンダリングのように)正しく置換されたテキストが含まれているように見える、UpdatePanelのレスポンスの前述の解析エラーが発生しています。

"1|#||4|2325|updatePanel|UpdatePanelCars|...<p>Ford</p>..." 

レンダリングされたHTMLがまったく同じ場合、なぜこの問題が発生しますか?違いを検出するクライアント側の解析方法は?

は参考のため、置換を行うコードはこれです:

class TemplatedPage: System.Web.UI.Page 
{ 
    ... 
    protected override void Render(HtmlTextWriter writer) 
    { 
     StringBuilder sb = new StringBuilder(); 
     StringWriter sw = new StringWriter(sb); 

     HtmlTextWriter hWriter = new HtmlTextWriter(sw); 
     base.Render(hWriter); //obtain full html markup, still containing {} at this point 

     sb.Replace("{CarMake}", "Ford"); 
     //other Replacements... 

     string alteredPageContents = sb.ToString(); 

     writer.Write(alteredPageContents); 
    } 
} 

私はfalseにEnableEventValidationを設定しようとしたが、それは効果がありません。

+0

応答に正しく置換されたテキストが含まれている場合は、sb.Replaceを実行する必要がありますか? – wazz

+0

@wazz sb.Replaceはテキスト置換を行うものです。 sb.Replace呼び出しの前に、レンダリングされたHTML出力にはまだ{CarMake} – emkayultra

+0

Ahが含まれています。これには、正しく置換されたテキストが含まれますが、コードが実行された後になります。 :\ – wazz

答えて

1

{something}の置換テンプレートは<asp:Literal runat="server">{something}</asp:Literal>のようなサーバーサイドコントロールの内側にあると思います。そのライフサイクルにおけるaspxページは多くの段階を経て、renderは最後に非常に近いです。 renderを実行する前に、すべてのコントロールの状態(内容)を保持するページがViewStateに保存され、サーバー制御コンテンツの変更によってpostの編集要求が一致せず、ViewStateが保存されました。
最新の瞬間、ページコンテンツを変更できるのはpage_PreRenderCompleteイベントハンドラです。
もちろん、ページがpostでない場合(完全または部分的に)、それは問題ではありません。
実際、私は多くの(すべての)ページで非常に似たようなコードを使用していますが、コントロールレンダリングの順序を変更するだけです(scriptを下に置くなど)。 renderの置換えでエラーが発生し、Page_PreRenderCompleteの中でいくつかの回避策を使用しました。

更新あなたは代替品を作るためにページツリーを処理することができPage_PreRenderCompleteでコメント

に答えます。

+0

この情報は本当に役立ちます。私は、SaveViewStateがレンダリングの前に呼び出されたことを知らなかった。しかし、私はまだ迷っています:あなたはPage_PreRenderComplete内で正確に何を修正していましたか?私はPageのソースを掘り下げており、確実にPageのHTML出力を参照するために使用できるプロパティは見ていません。 Page.Controlsを直接操作していないかぎり? – emkayultra

+0

@emkayultra更新を参照してください。 ;) –

+0

私はこれがあなたの言ったことになると思っていました。私は、ページのコントロール階層をナビゲートし、レンダリングされたHTMLの文字列を後処理するというパフォーマンスについて少し気にしていますが、これは行う必要があります。ありがとう! – emkayultra

関連する問題