2011-08-04 12 views
2

コントローラを正しく設計する方法について質問があります。
プロジェクトは非常にシンプルです:ブログ、それらの中のカテゴリと画像、ニュースのセクションを持つブログ。ASP.NET MVCコントローラの設計

しかし、管理者がこれらのものを編集、追加、変更できる管理パネルを作成したいので、私はこのためのコントローラをどのように構成するのか分かりません。私はこれまで...

  1. 管理パネルがsite/controller/editへのリンクがありますが、これらのアクションの結果のレイアウトは、標準的なものとは異なるものになります3 scenariosuを思い付いてきました。

  2. 管理コントローラーには、BlogAdd、BlogEditなどのすべての操作があり、URLは/site/admin/blogeditのようになります。

  3. adminのフォルダにブログコントローラを作成すると、urlは/site/admin/blog/editのようになります。同じ名前の2つのコントローラが良いアイデアのように聞こえないのでルーティングに関する問題を感じますが、私はこのような状況に見えます。

私が作ろうとしているのは、ブログの作成、編集、削除がデフォルトのブログそのものから完全に分離されているWordPressにやや似ています。

+0

3番目の方法が好きなら、同じ名前のコントローラなしで使用できます。コントローラー(BlogController、AdminBlogControllerなど)の命名規則を指定できます。そして、カスタムControllerFactoryを書いてください。/admin/rootがあり、それを次のルートと連結して作成するコントローラの名前を調べます。したがって、ユーザーが "/ site/admin/blog/edit" ControllerFactoryを入力すると、AdminBlogControllerが使用されます。 – Egor4eg

+0

感謝、私はControllerFactoryについて何も知らないが、私は今それについて何かを見つけようとするだろう。 :) – sed

答えて

3

MVCプロジェクトにAreasを作成し、管理領域のコントローラに管理者機能を持たせることができます。

これにより、一般的なブログ機能から管理機能を簡単に分離することができます。

これが私のやり方です。

+0

しかし、私はまだAdminの領域に同じコントローラ名を作成すると、 'Home'の要求が次の一致するコントローラを見つけました: proj.Controllers.HomeController proj.Areas.Admin.Controllers.HomeController – sed

+0

あなたのコントローラの名前は同じですか? 1つは管理者のコントローラ、もう1つはありません:) @ Egor4egのsugestionは良いものです。 AdminBlogControllerを使用して管理用のものを入手してください。 –

+1

同じ名前のコントローラが2つあることは完全に有効です。 * global.asax *( 'MapRoute'メソッドの5番目のパラメータ、4番目のパラメータ、ルート制約を' null'に設定することができます)で検索するデフォルトルートの名前空間を制限する必要があります。 –

0

セキュリティを使ってルートを同じに保ち、さまざまな役割を処理するのはなぜですか?たとえば、次のように

  • /ブログ/名前のトピック/ビュートピックを表示するだけでログインが有効になって話題を編集する(すべてのユーザー)
  • /ブログ/名前のトピック/編集(ユーザー)
  • /ブログ/新しいトピックを作成するために追加(ユーザのみログインのために有効)

あなたは、単一のコントローラでこれらのアクションを処理し、[承認]属性を経由してログインしているユーザーが必要なアクションを飾ることができます。あなたのビュー上のリンクと同じことは、リンクを編集して可視のユーザーだけにトピックを追加できるようにすることです。

前述の追加/編集リンクに管理者がアクセスできるように別のパネルを作成することはできます。

+0

はい、これがオプションの1つです。ここで私がバグを犯すのは、URLそのものだけです。サイト/管理者/ブログ/編集/ ID(または名前)にしたいと思います。私が何かを考え出すことができなければ、私はこの方法を使うだけです。 – sed

4

URLとコントローラが1対1の関係にあると考えるのはやめてください。これは物事をずっと簡単にし、混乱を少なくします。 URLはMVCのルーティング機構では機能させることができますが、必要なURLのためにコントローラの設計/構成を制限する理由はありません。

ウェブサイトを構築する際には、コントローラ(および一般的なインターフェイス)に注目し、そのポイントに達するまでURLを無視してから、適切なURLスキームを考え出すと、ルーティングシステムに入り、既存のコントローラのアクションに接続するルートを自由に設定できます。

ブログエンジンのコードを作成したら、ユーザーのワークフローをよりよく理解し、URLを整理するさまざまな方法を見つけることができます。コントローラ自体に触れることなくURLを再編成できます。あなたの最初の要件については

あなたの最終目標に応じて、これを実行するには、2つの方法があります。あなたの目標が同じコアコンテンツを表示するが、利用可能な異なるユーザーオプション(ページ上の異なるレイアウト、別のボタンなど)を持っている場合は、実際には、ビューモデルのIsAdministratorプロパティを渡すことをお勧めします。それが真か偽かに基づいてページにわずかな変更を加えます。その理由は、ページのコアが同じであることを(おそらく)求めているためで、コアデータ(管理者と非管理者の両方に表示されているデータ)に関連するコードを複製できなくなります。

編集:だから要約では、それが簡単にに、ユーザが持つシステムとどのように相互作用するかに基づいていないとを開発するものに基づいてコントローラを整理します。あなたはいつも後者を変えることができます。前者を変えることはより困難であり、メンテナンスは煩わしいものになります。

関連する問題