Персонализируйте линейку маршрутизации asp.net MVC

Я не совсем понимаю, как использовать маршрутизацию в asp.net mvc. Я организовал свои представления и контроллеры в 2 основных папках: фронт-офис и бэк-офис. Теперь я хотел бы иметь действия внутри бэк-офиса, которые строят URL таким образом: frontoffice/controller/action/parameters И те, что внутри папки frontoffice, классическим способом: controller/action/parameter

Я написал эти правила, но они неверны

routes.MapRoute(
    name: "Backoffice",
    url: "Backoffice/{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

routes.MapRoute(
    name: "Frontoffice",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

Таким образом, все действия внутри фронт-офиса создают URL-адрес с «бэк-офисом». как мне это сделать?


person Mino    schedule 30.08.2012    source источник
comment
Какая версия MVC? Вы пытались добавить два Area?   -  person Tomas Jansson    schedule 30.08.2012
comment
Косая черта в начале маршрута FrontOffice — это опечатка или это сделано специально? Вы пытались удалить это из определения маршрута?   -  person JTMon    schedule 30.08.2012
comment
Вам следует изучить, что относится к Области находятся в MVC. Когда они будут созданы, он соответствующим образом обновит ваш механизм маршрутизации.   -  person Mark Oreta    schedule 30.08.2012


Ответы (1)


Папки не имеют значения в ASP.NET MVC.

Неважно, в какую папку вы что-то положили, это не соответствует тому, где механизм маршрутизации будет это искать.

Вот как это сделать:

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

Убедитесь, что к вашему контроллеру добавлено имя Controller, и он наследуется либо от класса базового контроллера, либо от IController. Например:

public class MyController : Controller

Во-вторых, ваша маршрутизация предназначена для URL.

routes.MapRoute(
    "Backoffice",
    "backoffice/{controller}/{action}/{id}"

Чтобы добраться до этого маршрута, вам нужны две вещи, ни одна из которых не имеет отношения к вашей структуре каталогов:

  • Иметь контроллер, производный от Controller или реализующий IController
  • вызовите этот контроллер соответствующим образом: /backoffice/home/list/1

Если вы хотите, чтобы ваши контроллеры основывались на структуре папок, вы можете использовать аргумент namespace и убедиться, что ваши пространства имен совпадают со структурой каталогов.

Вы бы изменили свою маршрутизацию на выглядеть так:

routes.MapRoute(
    "backoffice",
    "backoffice/{controller}/{action}/{id}",
    new[] { "MyProject.Backoffice.Controllers" }
);

Тогда ваша структура каталогов должна быть:

MyProject 
  |
  - FrontOffice

  - BackOffice
    | 
    - Controllers
      |
      - MyController.cs

И пространство имен для вашего контроллера должно быть:

namespace MyProject.Backoffice.Controllers
{
    public class MyController
person George Stocker    schedule 30.08.2012