16

ユーザーの役割に応じて表示が異なるビューを作成したい。

ロールごとに別のビューを作成する必要がありますか?それとも、アクションではなく Veiw ページ自体でロールを確認する必要がありますか?

ビューページでロールを確認するにはどうすればよいですか?

4

8 に答える 8

26

または、アクションではなく、Veiwページ自体でロールをチェックする必要があります。そうであれば、ビューページでそれをチェックする方法を教えてください。

両方を行う必要があります。セキュリティ対策としてアクションのロールをチェックし、ビューのロールをチェックして特定のコントロールを有効/無効にします。

ビューページ内でロールをチェックする長い形式は次のとおりです。

HttpContext.Current.User.IsInRole("Administrator")

多くの開発者はページ ヘルパー メソッドを作成するため、アプリケーションをより簡潔なものにすることができます。

public static bool IsAdmin(this ViewUserControl pg)
{
    return pg.Page.User.IsInRole("Administrator")
}

次に、ビューでthis.IsAdmin()を使用できます

ビューをすっきりさせるには、部分ビューの使用を検討してください

<% if (IsAdmin())
   {
      Html.RenderPartial("AdminPanel");
   }
   else
   {
      Html.RenderPartial("UserPanel");
   }
%>
于 2009-01-03T16:24:40.313 に答える
6

ロールに基づいて表示が変化し、変化が小さい場合は、ビューでチェックを行います。ロールに基づいて特定のビューが制限されている場合は、コントローラーでチェックを行います。ビューが完全に異なる場合 (これは想像しにくいでしょう)、ロールごとに個別のビューが適切な場合があります。

ビュー ロジックを簡素化するために、特定のロール固有のビュー コンポーネントを部分ビューに抽象化することができます。基本的には、ロールに基づいて部分ビューを含めるかどうかを確認するだけで済みます。

また、「IsAuthenticated」をチェックする以外に、役割チェックロジックをコントローラーに移動し、役割に基づいて含める/除外する要素に関する情報を (データとして) ビューに渡します。これにより、実際のビジネス ロジックがビューに流れ込むのを防ぐことができます。

于 2009-01-03T16:09:51.763 に答える
3

MVC を使用している場合、開発の全体的なポイントは、ロジックをビューの外およびコントローラー内に保持することです。MVC トラックよりも WebForms 開発トラックの方が適しているように思えます。

そうは言っても、私は次のようなチェックを使用して、多くのページで管理者チェックを行っています。

<% if ((bool)ViewData["Admin"]) { %>
    <!-- Show admin controls here -->
<% } %>

しかし、実際のロジックをビューに構築しようとしている場合は、コントローラーにプッシュバックして作業を実行し、送信されたフラグに基づいてビューを可能な限りダムにする必要があることを理解する必要があります。

于 2009-01-03T15:53:52.717 に答える
2

asp.net mvcがロールに使用する正確なメカニズムを調査せずに、ビューでロールをチェックしている場合に行っているビジネスロジックをビューに配置することについて、ノーと叫びます

于 2009-01-03T15:46:30.390 に答える
2

ええ、それも私を悩ませていたものでした...しかし同時に、そのような小さな変更のためにまったく異なるビューをロードするのはばかげているようです.

ところで、コントローラーでこれをどのように設定しましたか。現在、私のコントローラーは以下のコードのように見えますが、これは正しくないと思います。

[Authorize(Roles = "Admin, Member")]
public ActionResult RegistrationInformation()
{

    return View();
}
于 2009-01-03T16:28:21.803 に答える
0

私はビューでこれを完全に制御するのが好きです、そして私はそれを見つけます:

<% if (User.IsInRole("Super User")) { %>
    <h1>Hello world!</h1>
<% } %>

ほとんどのシナリオで機能します。また、「コンテンツマネージャー」、「登録済み」など、他の役割の条件付き書式を簡単に実行することもできます。

管理者ロールの名前を変更する可能性があり、変更が1回だけで済むため、Todd Smithの回答が気に入っています。一方、「スーパーユーザー」または「管理者」の文字列をビューに直接配置する場合は、次のようにする必要があります。値を使用した場所で変更してください。

于 2010-03-23T15:20:22.830 に答える
0

私は ASP.NET MVC に (まだ) あまり詳しくありませんが、ビューで何らかの条件付きフィルターを実行することはできませんか? コントローラーがロールをビューに渡す場合、条件付きフィルターを実行して、ユーザーが管理者の場合は特定のコード ブロックを表示できるはずです。完全に別のページを表示したい場合は、複数のビューが必要です。それ以外の場合は、1 つを使用していくつかの条件を実行できます。

Ruby on Rails では、次のようになります (申し訳ありませんが、ASP.NET MVC についてはまだよくわかりません)。

<% if @user.admin? # is the user an admin %>
  <h3>Admin Tools</h3>
<% end %>
<p>Regular site content</p>

Rails では、パーシャルから余分なコンテンツをロードします。ASP.NET MVC にも似たようなものがありますが、名前を忘れてしまいました。多分それを調べますか?

申し訳ありませんが、これ以上お役に立てません。先ほども言いましたが、ASP.NET MVC を実際に使ったことがありません。

于 2009-01-03T15:53:24.573 に答える
0

他のすべてのモデルから拡張された基本モデルがあります。このモデルでは、ユーザーの役割をロードしました。httpcontext.user.isinrole() メソッドに基づいています。すべてのビューは、基本モデル型を想定して厳密に型指定されています。したがって、Model.CurrentUser.IsInRoles(Role1 | Role2) のようなすべてのビューをいつでもチェックインできます。もちろんビューだけでなく、穴のアプリケーションでも。

于 2009-08-13T19:02:34.327 に答える