Наследование контроллеров и выбор преобладающего контроллера - PullRequest
0 голосов
/ 10 января 2019

У меня есть базовый проект и разные наследующие проекты. Базовый проект имеет контроллеры, которые я иногда хочу наследовать и переопределять (частично).

Базовый проект:

public virtual ActionResult Index(string filter = "", int page = 1)

Подпроект:

public override ActionResult Index(string filter = "", int page = 1)

Теперь я изменил routeConfig, чтобы маршрутизация отображалась на логику из правильного пространства имен.

context.MapRoute(
                "Routename",
                "AreaName/{controller}/{action}/{id}",
                new { controller = "ControllerName", action = "Index", id = UrlParameter.Optional },
                new string[] { "ProjectName.Areas.AreaName.SpecificControllers"}
            );

Однако я хочу, чтобы новые добавленные маршруты брались из конкретного проекта, если они там существуют. Те, которые не существуют, должны быть взяты из контроллера базового проекта. (Конкретный контроллер в основном начинается пустым и содержит только методы, когда желательно переопределение). Чтобы попытаться реализовать эту функциональность, я добавил другой проект в маршрутизацию здесь:

 context.MapRoute(
                "Routename",
                "AreaName/{controller}/{action}/{id}",
                new { controller = "ControllerName", action = "Index", id = UrlParameter.Optional },
                new string[] { "ProjectName.Areas.AreaName.SpecificControllers", "ProjectName.Areas.AreaName.GenericControllers"}
            );

Однако это, очевидно, приводит к следующей ошибке:

Multiple types were found that match the controller named 'MethodName'. This can happen if the route that services this request ('CRM/{controller}/{action}/{id}') does not specify namespaces to search for a controller that matches the request. If this is the case, register this route by calling an overload of the 'MapRoute' method that takes a 'namespaces' parameter.

The request for 'MethodName' has found the following matching controllers:
ProjectName.Areas.AreaName.SpecificControllers.ControllerName
ProjectName.Areas.AreaName.GenericControllers.ControllerName

Есть ли способ реализовать это так, чтобы моя маршрутизация всегда сначала смотрела на конкретный контроллер, а только на общий контроллер, если он не может найти метод в конкретном контроллере?

1 Ответ

0 голосов
/ 10 января 2019

Как правило, маршрутизация выбрать метод базового контроллера, насколько я знаю.

Нет прямой поддержки для решения проблемы, упомянутой вами в этом вопросе.

Есть несколько способов решить эту проблему.

Вариант 1 (мой фаворит): Администратор на базе и Маршрут на унаследованном контроллере.

Для использования [Area] на базовом контроллере и [Route] на унаследованных контроллерах.

Мне лично нравится такой подход, потому что он сохраняет код внутри контроллера чистым.

[Area("Admin")]
AdminBaseController: Controller { }

[Route("Users"))
UserAdminController : AdminBaseController { }
  • URL-адрес будет / Admin / Users / Action

Опция 2: Использовать определенный префикс маршрута в производных действиях контроллера [Маршрут ( "Admin")] AdminBaseController: Controller {}

public static string UserAdminControllerPrefix = "/Users";
UserAdminController : AdminBaseController { 

[Route(UserAdminControllerPrefix + "/ActionName")]
public void ActionName() {  }

}
  • Сформированный URL будет / Admin / Users / ActionName

вы можете выбрать тот вариант, который подходит вашему стилю. Надеюсь это поможет. Оба подхода, упомянутые в этом ответе: Наследование маршрутизации атрибутов ядра MVC ASP.NET

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...