2011-06-28 7 views
1

現在、トラッキング/分析コードはすべてusercontrol(ascx)にあります。 CMSを使用することで、トラッキングが必要なすべてのページにコントロールをドロップするだけで済みます。確かにUserControlが1回だけ含まれていることを確認

これで、ユーザーが不注意に既にコントロールを含む可能性のあるページにコントロールをドロップする可能性があります。例:コントロールをマスターページに追加します。このマスターから継承したページにコントロールを追加します。

ページをレンダリングするときにユーザーコントロールが一度だけ使用されるようにするにはどうすればよいでしょうか?

答えて

1

すべてのコントロールとその親/子をループする方法はありません。例えば

Public Module ExtensionMethods 

    <Runtime.CompilerServices.Extension()> _ 
    Public Function FindControlRecursively(ByVal parentControl As System.Web.UI.Control, ByVal controlType As Type) As System.Web.UI.Control 

     If parentControl.GetType = controlType Then 
      Return parentControl 
     End If 

     For Each c As System.Web.UI.Control In parentControl.Controls 
      Dim child As System.Web.UI.Control = FindControlRecursively(c, controlType) 
      If child IsNot Nothing Then 
       Return child 
      End If 
     Next 

     Return Nothing 

    End Function 

End Module 

、あなたはそれを確認することができます。

If Not FindControlRecursively(Me.Page.Master, GetType(UC_Status)) Is Nothing Then 
    'thow exception or whatever' 
End If 

注:すべてのテストされていない

+0

素晴らしい、ありがとうTim。それは私が探しているようです。 – cschear

0

追加するときにページ上のコントロールをループする可能性があります。存在する場合は追加しないでください。

+0

これを行う方法の例はありますか?コントロール自体から行うことができますか? – cschear

2

あなたのチームの構成に大きく依存します。多くのチームにとって、「最良の」方法は単にに、マスターページのコントロールを含むポリシーを採用することです。

開発者がこのルールに従うことを信頼できない場合は、さらに技術的な解決策があります。たとえば、コントロールがレンダリングされるときにリクエストごとのフラグを設定し、毎回そのフラグがそのリクエストでレンダリングされていないことを確認することができます。指定されたリクエストで既にレンダリングされている場合は、再レンダリングされません。

+0

私は同意する - ちょうどそこより信頼できる答えがあることを望む。 – cschear

+0

@Chris:あなたの開発者が信頼できない場合、それは別の話です。私は自分の投稿を編集しました。 – StriplingWarrior

+0

ありがとうございます。開発者ではない人々の行には、この標準に従うことができませんでした。 – cschear

0

これは設計時の問題であるため、再デプロイする前に追加されたページをテストする以外にはあまりできません。

これが実行された場合、コントロールを反復して同じタイプを探すことができます。見つかった場合は削除してください。

1

のHttpContextクラスは、自分の書き込み権限のあるアイテムのコレクションを持っています現在の要求が処理されている限り、その人生から読むことができます。コントロールをページにドロップするだけであれば、コントロール自体がHttpContext.Current.Itemsコレクションにフラグを設定してロードされているかどうかを確認し、既にロードされている場合は、出力を出力しません。一度読み込むことだけを賢明にしたいのであれば、コントロールをページにドロップするのではなく、コントロールを読み込むためのヘルパー/静的メソッドを書くことができます(例えば、デベロッパーがページにドロップするプレースホルダコントロール)。ヘルパーメソッドは、HttpContextを使用してコントロールを読み込むかどうかを判断できます。

関連する問題