0

左側のメニュー パネルを持ち、右側のメイン パネルがコンテンツ パネルになる ASP.NET MVC4 アプリケーションを作成しています。( @RenderBody)

メニュー上のリンクは、ユーザーのログイン ロールに基づいて生成されます。たとえば、より高いアクセス権を持つユーザーには、より多くのリンクがメニューに表示されます。これらのアクセス権はデータベースに保存されます。

すべての_Layout.cshtmlページが継承するページがあります。

ログイン時にアクセスがデータベースから 1 回だけ取得されるように、アクセス メニューをどのようにコーディングすればよいですか? その後、ユーザーが移動するすべてのページで、ユーザーのアクセス権をデータベースに再クエリする必要はありません。

アクセス メニュー ページにHtml.RenderActionまたはを使用する必要がありますか?Html.Partial

4

3 に答える 3

0

これを行う最も簡単な方法は、NuGetを使用してプロジェクトに追加できるMVCSiteMapProviderを使用することです。

securityTrimmingEnabledユーザーがサイトマップから、したがってメニューから表示することを許可されていないアイテムを自動的に削除するオプションがあります。

ログイン中にデータベースからアクセスが1回だけ取得されるように、アクセスメニューをどのようにコーディングする必要がありますか?

RoleProviderを使用してロールを取得する必要があります。ロール用の独自のデータベーススキーマがある場合は、カスタムロールプロバイダーを作成する必要がある場合があります。カスタムロールプロバイダーは、データベースに頻繁にアクセスしないようにキャッシュを実装できます。または、ロールが多すぎない限り、CacheRolesInCookieプロパティを使用できます。

次に、Authorize保護する必要のあるコントローラーとアクションに属性を設定します。

[Authorize(Roles="SomeRole")]
public ActionResult MyAction()
{
    ...
}
于 2012-10-30T07:49:40.227 に答える
0

あなたの考えはRenderAction論理的に正しいです。で追加OutputCacheするだけでVaryByCustom、役割を確認でき、ページとユーザーごとにデータベースにアクセスしません。

役立つリンク:

于 2012-10-30T07:34:55.147 に答える
0

Shared フォルダーに「Navigation.cshtml」という部分ビューを定義できます。そして、_Layout.cshtml で、次のような呼び出しを行うことができます。

<div id="left-menu">
   @Html.Partial("Navigation")
</div>

Navigation.cshtml は次のようになります。

@if(Request.IsAuthenticated) {
  // show links for authenticated user.
}
else {
 // show links for non-authenticated user.  
}
于 2012-10-30T07:27:12.900 に答える