2009-05-19 7 views
6

で、サーバー側でHTML出力を変更します。私たちはクリックするとは、サードパーティのWebBrowserコントロールは、自分自身を表示するには、次のコードを生成し、ASP.NET

<div id="uwg"> 
    <input type="checkbox" /> 
    <div>blah-blah-blah</div> 
    <input type="checkbox" /> 
</div> 

<div id="uwg"> 
    <input type="checkbox" disabled checked /> 
    <div>blah-blah-blah</div> 
    <input type="checkbox" disabled checked /> 
</div> 

にそれを変更することが可能ですon

<asp:CheckBox id="chk_CheckAll" runat="server" AutoPostBack="true" /> 

同じページにありますか?

サーバー側(ASP.NET)で行う必要があります。

そのサードパーティのコントロールは、このためのインターフェイスを提供していないので、唯一の可能性はhtml出力で作業することです。どのページイベントを処理する必要がありますか?また、DOMモデルに相当するものがあるか、あるいは出力を文字列として処理する必要がありますか?

答えて

20

、我々は次のメソッドを使用することができます。

protected override void Render(HtmlTextWriter writer) 
{ 
    // setup a TextWriter to capture the markup 
    TextWriter tw = new StringWriter(); 
    HtmlTextWriter htw = new HtmlTextWriter(tw); 

    // render the markup into our surrogate TextWriter 
    base.Render(htw); 

    // get the captured markup as a string 
    string pageSource = tw.ToString(); 

    string enabledUnchecked = "<input type=\"checkbox\" />"; 
    string disabledChecked = "<input type=\"checkbox\" disabled checked />"; 

    // TODO: need replacing ONLY inside a div with id="uwg" 
    string updatedPageSource = pageSource; 
    if (chk_CheckAll.Checked) 
    { 
     updatedPageSource = Regex.Replace(pageSource, enabledUnchecked, 
       disabledChecked, RegexOptions.IgnoreCase); 
    } 

    // render the markup into the output stream verbatim 
    writer.Write(updatedPageSource); 
} 

ソリューションはhereから取得されます。

+0

これは、自分のページまたはWebコントロールのいずれかのメソッドで、サードパーティのコントロールから継承されます。 – Roma

+0

このソリューションは自分のユーザーコントロールでうまくいきます。自分が行っていることを理解できない人には、この関数はフォームの(または私の場合はコントロールの)デフォルトよりも優先されます関数をレンダリングし、その中の一部のHTMLを別のHTMLに置き換えます。 – Jrud

4

それを継承し、コントロールツリーでコントロールを見つけて、必要に応じて属性を設定します。

protected override void OnPreRender(EventArgs e) 
{ 
     base.OnPreRender(e); 
     (this.Controls[6] as CheckBox).Disabled = true; 
} 

明らかに、コントロールが他のプロパティに応じて出力を変更したり、ライブラリをアップグレードした場合、これは脆弱です。回避策が必要な場合は、これが機能します。チェックボックスは、サーバーで実行されていないか、またはコントロール内に封入されている場合

+0

素晴らしい!そして、私は最初のdivをidで取得できます(私はそれを表示しませんでしたが、idを持っています)。 – Roma

+0

はい、FindControl( "id")を使用できます –

+0

ありがとうございます。私の現在のページに対して継承することなくPage.OnPreRender(EventArgs e)を実装することはできますか? – Roma

関連する問題