2009-09-09 13 views
5

通常、私のURLは標準のように見える:www.example.com/controller/actionASP.NET MVCで管理セクションのルーティングを設定する方法は?

今、私がセットアップしたいように私の管理セクション:

 
www.example.com/admin/ 
www.example.com/admin/user/list 
www.example.com/admin/content/add 
etc. 

だから形式は次のとおりです。www.example.com/admin/controller/action

私が把握するように見えることはできません上記のようにルートを設定する方法。

答えて

11

ルート定義の最初にハードコピーされた 'admin'セクションで新しいパスをマップするだけで済みます。例えば

Global.asax.csファイルにRegisterRoutesであなたのルートにこれを追加し、それは(あなたが他のルートを追加していないと仮定した場合)デフォルトルート上に表示されていることを確認します

routes.MapRoute(
    "Default",            
    "admin/{controller}/{action}/{id}",      
    new { controller = "Home", action = "Index", id = "" } 
); 

注:「管理者」ルート定義の開始時に部分的にハードコードされています。

注2:デフォルト以外のルートを追加した場合は、ルートが正しく並べ替えられていることを確認する必要があります。ここで

は、MVCのルーティングに関するScott Guthrieから良いブログ記事へのリンクです:URL Routing

+3

物事を使うと、他のコントローラには 'admin /'の接頭辞でアクセスできなくなります。あなたのサイト/管理者/ホームからあなたのサイト/ホームを訪問することもできます。 –

6

ケルシーの答えは、マークを右ですが、私は議論に何かを追加したいです。もう1つの選択肢は実際には "admin"ルートを実際に持たないことですが、代わりに制限されたURLに実際にアクセスするためには管理者認証セッションが必要です。

「従来の」RESTfulアプリケーションでは、これがしばしば行われます。コントローラーは操作しているリソースのタイプを表し、アクションは動詞で、idはそのリソースの特定のメンバーの一意のIDです。言い換えれば

、代わりに持つの:

/content/list (for normal users) 
/admin/content/add (for admins) 

あなたはURLに/管理者を追加/

/content/list (for everyone) 
/content/add (for admin, but must be authenticated to work) 

は本当にあなたが書くことができることをおそらく除いて(任意のbenifitsを追加しないだろう/ adminの下にあるものに対しては単一のルールでセキュリティロジックを確保しています)が、より複雑なルートと標準RESTfulを破るというトレードオフがあります。スタンダードプラクティスを破ること自体は悪いことではありませんが、理由のためにスタンダードであると考えるべきであり、それを打破するための特別なメリットがなければ、それを遵守することも考えられます。

両方のURLスタイルでユーザーを認証する必要があることに注意してください。そうでなければ誰でも使用できます。

ASP.NET MVCでは、ActionFiltersを使用してユーザーレベルに基づいてアクション(またはコントローラ全体)へのアクセスを制限できます。管理者専用のアクションをこれらのフィルタで修飾することにより、認証された管理者だけが実際にそれらを使用できるようにすることができます。

詳細についてはScott Gu'sブログエントリまたはRob Connery's postをお読みください。

+0

あなたはどのように(すべてを見るためのアクセス権がない)ユーザーのリストアクションと、管理者のためのリストアクション(すべてのものを見ることができます)を処理しますか?私はアクションリストlistAdminまたは何か愚かなことをしたくないです。それとも私は間違った方向に行くのですか? –

+0

@MrRogers - それは本当に2つの違いにかかっています。唯一の違いが表示されているデータと表示されている場合、通常は同じビューを維持しますが、コントローラに表示するデータを指定させます。 2つのビューが実際にわずかに異なる場合(たとえば、管理者用の編集/削除ボタンがある場合など)、条件テンプレートを使用してビューテンプレートで管理ステータスを確認できます。 ViewDataまたはセッションで管理ステータスを設定できます。最後のオプションの1つは、それらを部分的に取り出すことです。したがって、あなたは1つのビューlist.aspxを持っていますが、次にadminと通常のユーザーはそれぞれ部分的です。 – Matt

3

MVCバージョン2では、これを正しく行うことを可能にする「エリア」コンセプトが追加されました:)ここではScottGu's post about MVC 2 Previewです。

+0

領域はMVC2の優れた機能ですが、この特定のユースケースでは、同じリソースを別のコントローラに分割しています。つまり、すべての "コンテンツ"ロジックを1つのコントローラにまとめるのではなく、それを壊してしまったのです。この場合、DRYルールに違反する可能性は非常に高いです。セマンティックな不一致はもちろんですが。 – Matt

+0

それはすべて、管理インターフェースが何をしているかによって異なります。システムを管理するためのバックエンドであれば、これはあなたのコンテンツとは全く異なるものです。単に機能を追加しただけであれば、認証でそれを制限するというあなたの提案はおそらく良いでしょう。しかし、私はそれがadminインターフェイスにあることは疑う。 – Runeborg

関連する問題