1

我是 ASP.NET MVC 的新手,我面临一些结构设计问题。

我不知道如何设置路由。

我想要以下内容:

http://website/ > HomeController Action=Index

上市:
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

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

对于大多数部分,默认的 mapRoute 都很好:

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

当我开始放置“类别”而不是产品的 id 时,问题就开始了……
我应该对 routeUrls 进行“硬编码”,例如“products/category/{id}”吗?

对于管理部分:
我想将属于网站管理部分的所有控制器放在:/Controllers/Admin/XxxController.vb 中。是否可以对它们进行命名空间并让它们具有与公共部分相同的名称?eq
- 用于公共部分的 Website.ProductsController 类和
- 用于管理部分的 Website.Admin.ProductsController?我应该如何设置这个?

4

2 回答 2

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 = ""})

至于拥有两个具有相同名称的控制器,是的,您可以使用不同的命名空间并在 mapRoute 方法中指定它们来做到这一点。有一个过载需要string[] namespaces。只需确保在路由时为具有相同名称的控制器指定名称空间。

于 2009-04-28T18:42:35.947 回答
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

您的 Index 方法可以采用一个可为空的 int (int?Id),其中 Id 对应于定义的产品。如果 Id.HasValue 为 false,则返回 ListCategories 结果。


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

这可以使您的附加路由保持清洁。

于 2009-04-28T18:43:47.427 回答