2016-11-18 17 views
1

私はMVCの領域用語に新しく、私はそれを使いたいです。私はAreaのコントローラーを指す以下のディレクトリーを持っています。エリアのコントローラのURLが長すぎます。URLを短縮する方法は?

Areas > Admin > Controllers > AdminController 

AdminControllerのインデックスアクションにアクセスするには、http://localhost/Admin/Adminにアクセスする必要があります。私は第2の「管理者」を取り除きたい。入力するのはhttp://localhost/Admin/のみです。どうやってやるの?

AdminAreaRegistration.csあなたがURLに含めていない限り、ルーティングエンジンは、それはあなたがしたいコントローラ識別する方法はありませんので、あなたは、コントローラのデフォルト値を指定していない以下のMapRoute

public override void RegisterArea(AreaRegistrationContext context) 
{ 
    context.MapRoute(
    "Admin_default", 
    "Admin/{controller}/{action}/{id}", 
    new { action = "Index", id = UrlParameter.Optional } 
    ); 
} 
+2

だろうHomeControllerべきであることを示唆している持つ

あなたがその中に同じ名前のコントローラを持っていれば、エリアを持つという目的を打ち破ることができます) –

+0

それは働いていました。しかし、新しいコントローラは "Admin"、アクション= "インデックス"、id = UrlParameter.Optional} "新しい{controller =" Admin "、action =" Index "、id = UrlParameter.Optional}"を指定すると、既定のコントローラがAdminであることを指定しているのでしょうか? –

+0

はい、まさにそうです。 - もしthあなたの '' Admin_default '、 'ルート(Adminで始まる)にマッチします。 2番目のセグメント(コントローラ用)を指定しなかったので、コントローラとアクションのデフォルト値を使用します(実際には '.../Admin/Admin/Index'と同じです)。 –

答えて

2

を持っています案内する。あなたは、それが../AdminAdminControllerIndex()方法にナビゲートすることを意味しますが、それはまだあなたがAdminControllerに別のメソッドに移動したい場合ことを意味し

context.MapRoute(
    "Admin_default", 
    "Admin/{controller}/{action}/{id}", 
    new { controller = "Admin", action = "Index", id = UrlParameter.Optional } 
); 

コントローラ名のデフォルト値を与えることによってこの問題を解決することができますURLは ../Admin/Admin/AnotherMethodである必要があります。これはおそらくあなたが望むものではありません。

領域の目的は、コントローラとメソッドを論理的にグループ化することです。たとえば、ショッピングカートアプリのProductsControllerには、../Productに移動して商品のリストを表示したり、../Product/Details/1に移動して商品の詳細を表示したりすることができます。しかし、サプライヤーが製品を作成し編集するための他の方法が必要な場合がありますので、別のSuppliers領域を作成し、../Suppliers/Productsが製品リストにナビゲートし、../Suppliers/Products/Edit/1が製品の詳細を更新できるようにします。 AdminエリアのAdminControllerが本当に意味がない、と私はそれが管理タスク(およびルート定義に関連付けられている一般的な方法が含まれている場合は、デフォルトのコントローラを与えるnew { controller = "Home", .. }

関連する問題