2009-04-28 73 views
1

我新的ASP.NET MVC和我現在面臨一些結構性的設計問題。ASP.NET MVC結構設計問題

我無法弄清楚如何設置路由。

我想以下幾點:

 
http://website/       > HomeController  Action=Index 

Public: 
http://website/{controller}    > SectionController Action=Index 
http://website/products/id    > ProductsController Action=Details 
http://website/products/category/id  > ProductsController Action=ListByCatId 
http://website/products/categories/  > ProductsController Action=ListCategories 
http://website/products/categories/id > ProductsController Action=DetailsCategories 

Admin: 
http://website/admin/     > AdminController Action=Index 
http://website/admin/{controller}  > SectionController Action=Index 

默認圖路線是對大多數零件:

routes.MapRoute("Default", "{controller}/{action}/{id}", _ 
       New With {.controller = "Home", .action = "Index", .id = ""}) 

當我開始把「類別」,而不是產品的問題的id開始...
如果我硬編碼「的routeUrls,如「產品/分類/(編號)」?

對於管理部分:
我喜歡把屬於在該網站的管理部分的所有控制器:/Controllers/Admin/XxxController.vb。是否有可能命名空間並讓它們與公共區域中的名稱相同? e.q.
- Website.ProductsController類公共部位和
- Website.Admin.ProductsController爲管理部分?我應該如何設置?

+0

*領域*(新的MVC 2)可以幫助您與此有關。它們提供了站點不同區域之間的清晰分隔,區域定義了路由,控制器等內容。 – bzlm 2010-01-27 11:01:02

回答

3

這是我會怎麼做:

routes.MapRoute("ProductDetail", "Products/{id}", _ 
    New With {.controller = "Products", .action = "Details", .id = ""}, 
    New With {.id = @"\d+"}) 
    //constraint, so this route will not catch a category name 
    //or the URL below 

routes.MapRoute("ProductList", "Products/category/{id}", _ 
    New With {.controller = "Products", .action = "ListByCatId", .id = ""}) 

routes.MapRoute("Category", "Products/categories/{id}", _ 
    New With {.controller = "Products", .action= "ListCategories", .id = ""}) 
    //for the route above, let it fall to the ListCategories action 
    //and in that action take a nullable of int as a parameter. 
    //if the id parameter has a value, 
    // return DetailsCategories(id) 
    //else list the categories. 


routes.MapRoute("Default", "{controller}/{action}/{id}", _ 
    New With {.controller = "Home", .action = "Index", .id = ""}) 

至於有兩個控制器具有相同的名稱,是的,你可以與具有不同的命名空間,並在圖路線方式識別他們做到這一點。有一個超載需要string[] namespaces。只需確保在路由時爲具有相同名稱的控制器指定命名空間。

1

是的,如果你需要補充的是不對應的默認附加路由,繼續前進,這樣做。您需要在默認路線上方添加其他自定義路線,並在添加路線時使用窄到寬的順序(以便首先進行窄匹配)。我會建議讓你的控制器動作匹配你想要首先儘可能顯示的默認命名。

代替:

http://website/products/id    > ProductsController Action=Details 
http://website/products/category/id  > ProductsController Action=ListByCatId 
http://website/products/categories/  > ProductsController Action=ListCategories 
http://website/products/categories/id > ProductsController Action=DetailsCategories 
使用

http://website/product/id    > ProductsController Action=Index 
http://website/product/category/id  > ProductsController Action=category 
http://website/product/  > ProductsController Action=Index 
http://website/product/categories/id > ProductsController Action=categories 

索引方法可以採取可空INT(INT標識?),其中ID對應於定義的產品。如果Id.HasValue爲false,則返回ListCategories結果。


public ActionResult Index(int? Id) 
{ 
    if (Id.HasValue) return Details(Id.Value); 
    return ListCategories(); 
} 

這可以讓你額外的路由清潔。