В настоящее время я работаю над проектом MVC, и я пытаюсь выяснить, как я могу расширить маршруты существующего Контроллера в пределах Района, в частности из другого проекта.Переопределение/расширение MVC-контроллера/области
Например, у меня есть контроллер с областью, которая выглядит следующим образом:
namespace MyProject.Areas.Foo.Controllers
{
[Authorize]
public class FooController : ApplicationController
{
//code
}
}
И то, что я хотел бы сделать, это быть в состоянии определить другой контроллер, в рамках отдельного проекта, который мог бы расширить это как так:
namespace MyOtherProject.Areas.Foo.Custom.Controllers
{
public class FooController : ApplicationController
{
public string Bar()
{
return "Bar";
}
}
}
в принципе, я хотел бы контроллеры почти функции, как если бы я использовал partial
ключевое слово (так что я мог бы назвать любые действия в оригинале или новый).
Главная проблема
То, что я действительно пытаюсь достичь в том, что у меня есть основной проект с несколькими областями и еще одна области моим решения с различными клиентскими папками. Я хочу иметь возможность существенно расширить базовые контроллеры для моего основного проекта и добавить действия, специфичные для клиента, в этих клиентских папках, чтобы они могли использоваться в основном проекте. Я уже делаю это с некоторыми MVC-представлениями, но я надеялся, что смогу выполнить его и с контроллерами.
То, что я пытался
- Я попытался с помощью ключевого слова
partial
на оба декларациях класса, но так как они находятся в разных проектах/сборках, я не думаю, что работает. - Я определил событие сборки, которое переместило бы пользовательскую DLL в каталог
bin
основного проекта MVC, но это, похоже, не работает должным образом. - Я пробовал различные подходы к наследованию, надеясь, что новый класс будет поднят, но они не сработали (получена ошибка декларации дублирующего контроллера).
- Я читал о попытке использовать пользовательский
ControllerFactory
, но я не был уверен, как его реализовать. - Я попытался определить параметры маршрутизации пользовательского пространства имен в разделе AreaRegistration, чтобы выбрать новый контроллер, как в следующем примере.
Пример маршрутизации (AreaRegistration)
context.MapRoute(
AreaName,
String.Format("{0}/{{action}}/{{id}}", AreaName),
new { controller = AreaName, action = "Index", id = UrlParameter.Optional },
new[] {
String.Format("MyProject.Areas.{0}.Controllers", AreaName),
String.Format("MyOtherProject.Areas.{0}.Custom.Controllers", AreaName)
}
);
Update
Я попытался подход seen here согласно некоторым из обсуждения комментариев, которые вовлекали просто обработки этого через наследование:
// Main Project
namespace MyProject.Areas.Foo.Controllers
{
[Authorize]
public class FooController : ApplicationController
{
public ActionResult Index()
{
return View();
}
}
}
// This is in another project/namespace/assembly
namespace MyOtherProject.Foo.Controllers
{
public class CustomFooController : MyProject.Areas.Foo.Controllers.FooController
{
[Route("Foo/Bar")]
public string Bar()
{
return "Bar";
}
}
}
Так что мои нынешние шаги заключаются в следующем:
- унаследованный от базового
FooController
в основной проект в рамках другого проекта/решения. - Настройка маршрутизации атрибутов для доступа к пользовательскому контроллеру, чтобы избежать противоречивых маршрутов из основного проекта.
- Создал событие сборки, которое перемещает пользовательскую DLL в основной проект при его создании (так будет доступно) из нового пользовательского проекта.
Это, похоже, не имеет никакого значения. Я попытался перейти к URL-адресу Foo/Bar
, но он просто бросил 404, как будто он его вообще не видел. Файл CustomFooController.cs
находится в собственном отдельном проекте и представляет собой файл класса, а не проект MVC. Это верно? Нужно ли устанавливать правила маршрутизации в основном проекте?
Что случилось с использованием наследования? В проекте-B включить ссылку на проект-main, затем контроллер-B наследуется от main-контроллера. В качестве альтернативы, используйте общий класс в качестве базы и соответствующим образом настройте свои маршруты. –
Итак, я должен наследовать свой контроллер Project B от 'FooController' в проекте A? Если да, то как это повлияет на мою маршрутизацию, поскольку я хочу иметь возможность использовать ту же базовую маршрутизацию, то есть «Foo/ProjectAAction» или «Foo/ProjectBAction». Будет ли это работать? –
Все маршруты к контроллеру-B также будут получать основные действия контроллера, поскольку они являются частью контроллера-B по наследованию. т.е. ваши маршруты не будут знать о главных контроллерах проекта. –