2013-06-09 9 views
7

私は、作業中のプロジェクトのための動的なロールベースのナビゲーションソリューションを作成する方法を考え出してきました。ロールベースのナビゲーション

ナビゲーションには、usersロールに関連するリンクのみが表示されます。管理者には、アプリケーションの統計情報の表示、顧客アカウントの管理などのリンクがあります。標準ユーザーは管理するリンク

私は現在、という名前の部分的なビューを持っています。には、ロールチェックのためのいくつかの基本的な条件文と、適切なリンクを表示するためのマークアップの組み合わせがあります。これは動作しますが、すぐに管理できなくなる可能性があります。

ナビゲーション部分図:

@if(User.IsInRole("Admin")) { 
    <li><a href="#">Statistics</a></li> 
    <li><a href="#">Accounts</a></li> 
    <li><a href="#">Dashboard</a></li> 
} 
@if(User.IsInRole("User")) { 
    <li><a href="#">Account</a></li> 
    <li><a href="#">Friends</a></li> 
} 
// code omitted 

は視野の外にこのロジックを取得し、コントローラがこれを処理できるようにする方法はありますか?

+1

あなたのパーシャルは子供のアクションメソッドを使用していますか? –

+0

Daveに感謝します。いいえ、違います。以前は子どもの行動を実際に使っていませんでした。あなたの質問を拡大してもよろしいですか?私はこのシナリオで子どもの行動がどのような役割を果たすのか分かりません。 – mezmi

+4

子どもの行動は素晴らしいです。モデルはあなたを部分的なものに戻すアクションです。それらを 'Action("/Controller/Action/id ")'と呼びます。 idパーツは、作成するnavのハンドルにすることができ、モデルはnavアイテムのリストにすることができます。さらに、あなたの子供の行動は引数なしであなたのユーザーの役割を調べ、適切なナビゲーションバーを返すことができます。以前はロールベースのナビゲーションにこれを使用しました。 –

答えて

14

SOLUTION

示唆したように、私はメニューとそれぞれの役割のための部分的なビューと呼ばれるChildActionを作成しました。アクションの中で、私はいくつかの条件文を使っていくつかのロールチェックを行い、適切なビューをレンダリングします。

これは、条件付きステートメントをビューから外して、よりクリーンなソリューションにします。

私はそれをきれいにするために行うことができるいくつかのことがあると確信して、私はそれを改善しようと続けます。

ここに私が使った解決策があります。

私はメニューを表示したいレイアウトビューでこれを使用しました。

@Html.Action("Menu", "Navigation") 

次に、ナビゲーションと呼ばれるコントローラを作成し、Menuという単一のアクションを追加しました。

public class NavigationController : Controller 
{ 

    [ChildActionOnly] 
    public ActionResult Menu() 
    { 
     if (Roles.IsUserInRole("Administrator")) 
     { 
      return PartialView("_NavigationAdmin"); 

     } 

     return PartialView("_NavigationPublic"); 
    } 

} 
関連する問題