2012-05-11 18 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邏輯的。

幫助?

回答

2

當搜索路線時,會使用第一個與您的網址匹配的網址。 AdminUpdateCategoryView將匹配任何管理控制器和操作。你提供一個默認的cid「」,但這不應該因爲你要求cid是一個低於該值的數字。 AdminCategoryListView將匹配任何進入main的url。因爲您提供的默認頁面爲1,所以即使沒有提供頁面也無關緊要。

因此,如果AdminCategoryListView位於頂端:admin/main中的每條單一路由都將使用此路由。 如果AdminUpdateCategoryView位於達到此路線的管理員的每條路線上,並且具有數字cid值參數將使用它。

我建議把AdminCategoryListView放在最前面,因爲它是更具體的路線。刪除page="1"(取決於您是否要提供默認值),或將{action}替換爲「類別」,以便您的其他路線不使用此路線。你也應該提供一個默認的主控制器,否則它會認爲你當前使用的控制器是正確的。

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

//Put AdminUpdateCategoryView here