0

最近、大規模な .NET プロジェクトを継承しました。このプロジェクトでは、ロールの実装にパッチを適用する必要があります。役割が異なれば、サイトへのアクセスも異なり、一部の要素は現在のユーザーの役割に応じて非表示にする必要があります。

ある程度柔軟でモジュラーなアーキテクチャを考えると、ユーザーがアクセスできないサイトの部分にアクセスしようとしたときに、これを実装するのは簡単でした. しかし、コントロールの可視性を認証するときに問題が発生しました。

コントロールの多くは、独自のプロジェクト固有のコントロールを介して実装されていますが、リンクはほとんどが HtmlAnchors を介して実装されており、制限されたカテゴリに分類される他のいくつかのフィールドも汎用の html 要素です。

これを汎用アダプターでパッチする方法はありますか、またはプロジェクトに存在する膨大な数のコントロールと要素を調べて、これを単独で実装できる共通のベースを継承させる必要がありますか? この場合の手作業は多くの作業を意味し、最終的に正しいアプローチであるかどうかは正確にはわかりません.

基本的に、ページのすべてのコントロールと要素を表示するかどうか、または .NET 4.0 Web プロジェクトでレンダリングしないかどうかをチェックする方法はありますか? そして、すべての要素が「制限レベル」を説明する新しい属性を受け入れて処理できるように、どうにかしてパッチを当てることができますか?

4

1 に答える 1

0

はい、そのようなことができます。ここで役立つ 2 つの ASP.NET 機能が思い浮かびます。

  1. ASP.NET タグ マッピング。この機能を使用すると、パーサーが特定の ASP.NET タグを検出したときにインスタンス化されるオブジェクトの型を変更できます (たとえば、すべての HtmlAnchors を、選択した基本クラスから継承する SpecialHtmlAnchors に置き換えることができます)。web.config の /system.web/pages/ の下に tagMapping セクションを追加するだけです。(私はこのサンプルをテストしていませんが、ほぼ正しいはずです。とにかく、これは出発点です。)

    <system.web>
      <pages>
        <tagMapping>
          <add tagType="System.Web.UI.HtmlControls.HtmlAnchor, System.Web"
             mappedTagType="My.Special.HtmlAnchor, MyAssembly"/>
        </tagMapping>
      </pages>
    </system.web>
    
  2. ASP.NET コントロール アダプター。特定の型のインスタンス化された各コントロールに出力アダプターをアタッチするように ASP.NET に指示できます。この機能はもともと、特定のブラウザーまたはブラウザーの種類 (デスクトップとモバイルなど) の出力の適応を容易にすることを目的としていましたが、それらを使用してほとんど何でも行うことができます。それらを使用するには、フォルダーに.browsersファイルを作成しApp_Browsersます (ファイルが存在しない場合は、VS で Web プロジェクトを右クリックし、[ASP.NET フォルダーの追加] の上にマウスを置き、[App_Browsers] を選択して選択します。次に、.browsersファイルを追加します)。 [新しいアイテムの追加...] ダイアログを使用して、このフォルダーに.browsersファイルを次のように変更して、カスタム コントロール アダプターを登録します。

    <browsers>
        <browser refID="Default"> <!-- all browsers -->
            <controlAdapters>
                <adapter controlType="System.Web.UI.HtmlControls.HtmlAnchor"
                    adapterType="My.Custom.RolesAwareControlAdapter, MyAssembly" />
            </controlAdapters>
        </browser>
    </browsers>
    

    コントロール アダプタSystem.Web.UI.Adapters.ControlAdapterは、通常のコントロールとほぼ同じレンダリング メソッドを持つ から継承します。ControlAdapter は、コントロールのレンダリングを完全に制御しますが、必要に応じてレンダリングを Target コントロールに委任できます。

コントロールに新しい属性を追加することについて: 既に既存のコードを調べて属性を追加しようとしている場合は、タグ タイプを変更して、カスタム コントロールを参照するようにしてみませんか? カスタム コントロールのパブリック プロパティは、設計時に値を指定できるように、マークアップ属性に自動的に昇格されます。

もう 1 つの優れた WebForms アプローチは、何百ものページとユーザー コントロールを編集するという退屈な作業は解決しませんが、LoginViewを使用することです。これは、あなたの問題を解決するように設計されているためです。

ご不明な点がございましたら、お気軽にお問い合わせください。喜んでご説明いたします。

于 2013-07-09T17:59:20.910 に答える