ASP.NET MVC Проблема структурного проектирования - PullRequest
1 голос
/ 28 апреля 2009

Я новичок в 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

mapRoute по умолчанию подходит для большинства частей:

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

Когда я начинаю ставить 'category' вместо id продукта, начинаются проблемы ...
Должен ли я «жестко закодировать» routeUrls, например, "products / category / {id}"?

Для административной части:
Я бы хотел поместить все контроллеры, относящиеся к разделу Admin сайта, в: /Controllers/Admin/XxxController.vb. Можно ли присвоить им пространство имен и позволить им иметь то же имя, что и в публичном разделе? e.q.
- Website.ProductsController класс для публичных частей и
- Website.Admin.ProductsController для раздела администратора? Как мне это настроить?

Ответы [ 2 ]

3 голосов
/ 28 апреля 2009

Вот как бы я это сделал:

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. Просто убедитесь, что вы указали пространства имен для контроллеров с одинаковыми именами при маршрутизации.

1 голос
/ 28 апреля 2009

Да, если вам нужно добавить дополнительные маршруты, которые не соответствуют стандартным, сделайте это. Вы захотите добавить свои дополнительные пользовательские маршруты выше маршрута по умолчанию и использовать узкий к широкому порядку при добавлении маршрутов (чтобы сначала сузились совпадения). Я бы посоветовал сделать так, чтобы действия вашего контроллера соответствовали именам по умолчанию, которые вы хотите видеть в первую очередь как можно больше.

вместо:

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 может принимать значение null int (int? Id), где Id соответствует определенному продукту. Если Id.HasValue равно false, вы возвращаете результат ListCategories.


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

Это может сохранить вашу дополнительную чистоту маршрутизации.

...