2012-05-11 4 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의 라우팅은 전자 논리입니다.

도와주세요!

답변

2

경로를 검색 할 때 URL과 일치하는 첫 번째 경로가 사용됩니다. AdminUpdateCategoryView은 모든 관리 컨트롤러 및 작업과 일치합니다. 기본 cid ""를 제공하지만 cid가 그 이하의 숫자 여야하므로 중요하지 않습니다. AdminCategoryListView은 main을 입력하는 모든 URL과 일치합니다. 기본 페이지 1을 제공하므로 페이지가 제공되지 않는 경우에도 아무런 문제가 없습니다.

따라서 AdminCategoryListView이 위에있는 경우 : admin/main의 모든 단일 경로가이 경로를 사용합니다. AdminUpdateCategoryView이 위에있는 경우 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 
관련 문제