2

私たちは、承認の内容が分野横断的な懸念事項であることを認識しており、私たちのビューでビジネス ロジックをマージすることを避けるためにできる限りのことを行います。

しかし、ビューをビジネス ロジックで汚染することなく、現在のユーザー ロールを使用して UI コンポーネント (ウィジェット、フォーム要素、テーブルなど) をフィルタリングするエレガントな方法はまだ見つかりません。同じことがモデル バインディングにも当てはまります。


形態:プロダクトクリエーション

田畑:

  • 名前
  • 価格
  • 割引

役割:

  • ロール管理者

    • 名前フィールドの表示と変更が許可されています
    • 価格フィールドを表示および変更できます
    • 割引を表示および変更できます
  • ロール管理者アシスタント

    • 名前の表示と変更が許可されています
    • 価格の表示と変更が許可されています

Fields各役割に示されているものは異なります。「管理者アシスタント」の役割もmodel binding無視する必要があります。discount field

どのようにしますか?

4

3 に答える 3

3

これを行う方法として、入力拡張メソッドの独自のバージョンを作成することが考えられます。たとえば、代わりに次のように作成して定義TextBoxできます。TextBoxRoles

public static MvcHtmlString TextBoxRoles(
    this HtmlHelper htmlHelper,
    string name,
    string RolesEdit,
    string RolesView
)

次に、コードでは次のようになります。

<%= Html.TextBoxRoles("Price", "Administrator","Administrator,Assistant") %>

次に、 の実装でTextBoxRoles現在のユーザーのロールをチェックしUser.IsInRole()て、ページに何を表示するかを決定します。

もちろん、使用するすべての入力拡張メソッドに対してこれを行う必要があります。

于 2010-04-29T15:19:22.020 に答える
1

現在のユーザーと承認プロバイダーへのアクセスの両方が既にコントローラーにあるため、これはコントローラーにとって理想的な責任です。単純な実装を使用すると、現在のユーザーがアクセスできるウィジェットをフィルター処理した後で、ウィジェットのコレクションをビューに渡すことができます。フォーム フィールドの場合、クライアント側の検証を考慮すると、状況が複雑になる可能性があります。

バインド部分は最も簡単です。これらの特殊なケースにカスタムバインダーを使用すると、コントローラーコンテキストにアクセスでき、そこから現在のユーザーを取得して値をバインドできるため、特にうまく機能します。あなたの役割の定義。

于 2010-04-29T22:32:27.837 に答える
1

AOP フレームワークである LinFu のようなものはどうでしょうか? 横断的である場合は、そうであると宣言し、そのように扱います。

于 2010-04-29T17:15:59.407 に答える