2012-05-11 8 views
0

私は一日中混乱しています。私はエリア内のルーティングを持っており、このように見えます。エリアと異なるパラメータのルーティング、誤解

public class AdminAreaRegistration : AreaRegistration 
{ 
    public override string AreaName 
    { 
     get 
     { 
      return "admin"; 
     } 
    } 

    public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRouteLowercase(null, "Account/{action}", 
            new {controller = "Account"}, 
            new {action = @"LogOff|LogOn|Create|Update|Delete|List"}, 
            new[] {"WebUI.Areas.Admin.Controllers"}); 

     context.MapRouteLowercase(//this works 
      "AdminUpdateCategoryView", 
      "admin/{controller}/{action}/{cid}", 
      new {area = "admin", controller = "Main", action = "UpdateCategory", cid = ""}, 
      new {cid = @"\d+"}, 
      new[] {"WebUI.Areas.Admin.Controllers"} 
     ); 

     context.MapRouteLowercase(//this not works 
      "AdminCategoryListView", 
      "admin/Main/{action}/{page}", 
      new { action = "Category", page = "1" }, 
      new {page = @"\d+"}, 
      new[] {"WebUI.Areas.Admin.Controllers"} 
     ); 

     context.MapRouteLowercase(
      "Admin_Default", // Route name 
      "admin/{controller}/{action}/{id}", // URL with parameters 
      new {controller = "Category", action = "Index", id = UrlParameter.Optional} // Parameter defaults 
     ); 
    } 
} 

私が書いたものを作品とするものではないが、それらの間の変化、動作し、動作する他は、動作しない動作しないものか?

例:ここでは

first case-> /admin/main/updatecategory/1 --> works 
      /admin/main/category/1  --> not works 
      result: /admin/main/category/1?page=1 

second case-> /admin/main/category/1 --> works 
       /admin/main/updatecategory/1 --> not works 
       result: /admin/main/updatecategory/1?cid=1 

は私のコントローラのアクションです:

public ActionResult Category(int? page) 
    { 
     int pageIndex = page.HasValue ? page.Value : 1; 
     return View("Category", CategoryViewModelFactory(pageIndex)); 
    } 

    public ActionResult CreateCategory() 
    { 
     return View(); 
    } 

    public ActionResult UpdateCategory(int cid) 
    { 
     return View(); 
    } 

    public ActionResult DeleteCategory(int? cid) 
    { 
     return View(); 
    } 

この問題とどのようにそれを解決するためには何ですか?

私は完全に混乱しています。ASP.MVC3のルーティングはe-logicalです。

ヘルプ?

答えて

2

ルートを検索すると、URLに一致する最初のルートが使用されます。 AdminUpdateCategoryViewは、任意の管理コントローラとアクションに一致します。あなたはデフォルトのcidを ""提供しますが、そのcidがそれ以下の数である必要があるので、それは重要ではありません。 AdminCategoryListViewは、mainに入るURLと一致します。デフォルトのページ1を提供するので、ページが提供されていない場合でも問題ありません。

したがって、AdminCategoryListViewが上にある場合:admin/mainのすべてのルートがこのルートを使用します。 AdminUpdateCategoryViewが上にある場合、このルートに到達し、数値のcid値パラメータを持つadminのすべてのルートが使用されます。

より具体的なルートであるため、AdminCategoryListViewを上に置くことをおすすめします。 page="1"(デフォルトを指定するかどうかによって異なります)、または{action}を「カテゴリ」に置き換えて、他のルートでこのルートを使用しないようにしてください。また、デフォルトのコントローラmainを提供する必要があります。そうしないと、現在使用しているコントローラが正しいものとみなされます。

context.MapRouteLowercase(
     "AdminCategoryListView", 
     "admin/Main/category/{page}", 
     new { action = "Category", controller = "Main" }, 
     new {page = @"\d+"}, 
     new[] {"WebUI.Areas.Admin.Controllers"} 
    ); 

//Put AdminUpdateCategoryView here 
関連する問題