2012-03-07 9 views
0

私はいくつかの同様の質問を見ましたが、私は別の問題があることを発見しました。ASP MVC4異なるエリアに同じ名前のコントローラーで適切なメソッドを見つける

基本プロジェクトと3つの領域にコントローラを持つMVC4プロジェクトがあります。各領域には、AdminControllerという名前のコントローラとメソッドListが含まれています。

私の問題は、メソッドリストに移動するリンクを使用するときに、常に同じコントローラ(たとえば、ユーザ領域のAdminController)を経由して返されるビューが正しいことです。

プロジェクトの構造は、このようなものです:

  • Mimbre.Administration(ウェブmvc4プロジェクト)
    • エリア
      • 内容
        • コントローラ
          • AdminController
        • モデル
        • ビュー
          • 管理
            • List.chtml -ContentsAreaRegistration.cs
      • ログ
        • コントローラ の
          • AdminController
        • モデル
        • ビュー
          • 管理
            • List.chtml
        • LogsAreaRegistration.cs
      • ユーザー
        • コントローラ
          • AdminController
        • モデル
        • ビュー
          • 管理
            • List.chtml
        • UsersAreaRegistration。CS
    • コントローラ(ベース・プロジェクト)
    • ビュー(基本計画)

エリア登録のためのクラスは、次のようにRegisterAreaメソッドが含まれています(apropiate名前と名前空間を持つに従って現在のエリア):

public override void RegisterArea(AreaRegistrationContext context) { 
     context.MapRoute(
      "Contents_default", 
      "Contents/{controller}/{action}/{id}", 
      new { action = "Index", id = UrlParameter.Optional }, 
      new string[] { "Mimbre.Administration.Areas.Contents.Controllers" } 
     ); 
    } 

G lobal.asaxは、(ベースのプロジェクトで)ベースのプロジェクトindex.chtmlで

 public static void RegisterRoutes(RouteCollection routes) { 

     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     AreaRegistration.RegisterAllAreas(); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      namespaces: new string[]{"Mimbre.Administration.Controllers"} 
     ); 
    } 

ためのレジスタルートのメソッドが含まれている私は、各エリアの方法を一覧表示するためのリンクを作成:生成で

<a href="@Url.Action("List", "Admin", new { area = "Contents"})" >Contents list</a> 
<a href="@Url.Action("List", "Admin", new { area = "Logs"})" >Logs list</a> 
<a href="@Url.Action("List", "Admin", new { area = "Users"})" >Users list</a> 

HTMLこれらのリンクが表示されますこのように:

<a href="/Contents/Admin/List/">Contents list</a> 
<a href="/Logs/Admin/List/">Logs list</a> 
<a href="/Users/Admin/List/">Users list</a> 

私はこれらのリンクが正しいと思いますが、問題は、どのリンクが常にユーザーエリアのAdminController、AdminContrのメソッドリストのメソッドリストを通して私を取るクリックしたことです別の領域のオレラーは決して選ばれない。

この問題は、コントローラの名前、各エリアの一意の名前を変更することで解決できますが、実際にはすべての領域で同じコントローラ名を使用する必要がありますか?

Thans in advance !!!

答えて

2

最後に、私はあなたの問題をシミュレートすることができました。間違ったコントローラーの名前空間でエリアを登録すると、同じ出力を得ることができます(アクセスしようとしているエリアは同じですが、同じユーザーのコントローラーにアクセスし、正しいビューで応答することができます)。

/管理/ホーム/リストルート:

namespace SandboxMvcApplication.Areas.Admin.Controllers 
{ 
    public class HomeController : Controller 
    { 
     public ActionResult List() 
     { 
      ViewBag.Message = "You've acessed Admin/List"; 

      return View(); 
     } 
    } 
} 

/管理/ホーム/リスト表示:

@{ 
    ViewBag.Title = "List"; 
} 

<h1>Admin</h1> 

<h2>@ViewBag.Message</h2> 

管理エリア登録:

public override void RegisterArea(AreaRegistrationContext context) 
{ 
    context.MapRoute(
     "Admin_default", 
     "Admin/{controller}/{action}/{id}", 
     new { action = "Index", id = UrlParameter.Optional }, 
     new string[] { "SandboxMvcApplication.Areas.Admin.Controllers" } 
    ); 
} 

/ユーザー/ホーム/リストルート:

public class HomeController : Controller 
{ 
    public ActionResult List() 
    { 
     ViewBag.Message = "You've accessed User/List"; 

     return View(); 
    } 
} 

/ユーザー/ホーム/リスト表示:

@{ 
    ViewBag.Title = "List"; 
} 

<h1>User</h1> 

<h2>@ViewBag.Message</h2> 

ユーザーエリア登録:この構成で

public override void RegisterArea(AreaRegistrationContext context) 
{ 
    context.MapRoute(
     "User_default", 
     "User/{controller}/{action}/{id}", 
     new { action = "Index", id = UrlParameter.Optional }, 
     new string[] { "SandboxMvcApplication.Areas.Admin.Controllers" } 
    ); 
} 

、私の出力は以下のとおりです。

  1. /管理/ホーム/一覧

    管理者

    あなたは、あなたが最初の単語の作品ということacessed管理/リスト

注意をしましたacessed管理/リスト

  • /ユーザー/ホーム/一覧に

    ユーザー

    をしました(正しい表示がレンダリングされたことを保証するが、リストアクションからの間違ったデータを伴う)。

    UserAreaRegistration( "SandboxMvcApplication.Areas.User.Controllers")でユーザーコントローラの名前空間を修正すると、すべて正常に機能します。

    これが役立つかどうかを確認したり、明示的にネームスペースを正しいコントローラに配置してみてください。また、Adminsコントローラが適切な名前空間を持っているかどうかを確認することもできます。

  • +0

    はフェリペ、答えてくれてありがとう、しかしAreaRegistrationクラスは一時的に、私はエリアごとにコントローラ、別の名前の名前を変更しなければならなかった、それはMV4のベータ版の問題がある場合、私は知らない、正しい名前空間を持っています。 – diegoe

    0

    ルート登録にもう1つの設定を追加する必要があります。これにより、DefaultControllerFactoryが意図しない領域でコントローラを検索できなくなります。

     routes.MapRoute( 
         name: "Default", 
         url: "{controller}/{action}/{id}", 
         defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
         namespaces: new string[]{"Mimbre.Administration.Controllers"} 
        ).DataTokens["UseNamespaceFallback"] = false; 
    
    関連する問題