Прежде всего, неплохо было бы вынести вашу модель в отдельный проект. Как вы обнаружили, это тривиально.
Что касается контроллеров и представлений, я не вижу очевидных преимуществ в их разделении для большинства основных проектов, хотя у вас может быть особая потребность в этом в конкретном приложении.
Если вы все же решите сделать это, вам нужно будет указать фреймворку, как найти ваши контроллеры. Основной способ сделать это - предоставить свой собственный ControllerFactory. Вы можете взглянуть на исходный код DefaultControllerFactory, чтобы понять, как это делается. Подтипа этого класса и переопределения метода GetControllerType (string controllerName) может быть достаточно для выполнения того, о чем вы просите.
Создав свой собственный ControllerFactory, вы добавляете следующую строку в Application_Start в global.asax, чтобы сообщить фреймворку, где его найти:
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
Обновление: прочтите этот пост и сообщения, на которые он ссылается, для получения дополнительной информации. См. Также комментарий Фила Хаака к этому сообщению о:
ControllerBuilder.Current.DefaultNamespaces.Add(
"ExternalAssembly.Controllers");
... что не является полным решением, но, возможно, достаточно хорошо для простых случаев.
Хотя разумно создать свой собственный ControllerFactory, я счел более удобным определять все мои контроллеры в каждом проекте, но выводить их из контроллеров в моем общем проекте:
Это дает дополнительное преимущество, заключающееся в том, что у вас есть место для размещения логики контроллера, которая отличается от проекта к проекту. Кроме того, другим разработчикам проще быстро найти логику вашего контроллера, поскольку контроллеры существуют в стандартном месте.
Что касается целесообразности этого, я думаю, что это так. Я создал некоторую общую логику управления учетными записями, которой хочу поделиться между проектами, которые в остальном имеют очень разную бизнес-логику. Итак, я использую свои контроллеры учетной записи и администратора, но другие контроллеры относятся к их соответствующим проектам.
источник
В классе добавьте следующий код (для кода контроллера u'r)
}
В папке просмотра проекта mvc добавьте папку для контакта и создайте файл Call.cshtml.
Добавьте ссылку на проект библиотеки классов в свой основной проект MVC.
источник
Моя проблема решена после того, как я обновил
System.Web.Mvc
ссылку NuGet, поэтому MvcWebsite и Class Library используют одну и ту жеSystem.Web.Mvc
версиюНет необходимости добавлять пространства имен по умолчанию
источник
Самая простая форма разделения, которую я использую, - это сохранить представления «как есть» в исходном проекте MVC, но удалить контроллеры. Затем в новом проекте ClassLibrary добавьте классы Controller и убедитесь, что они наследуются от Controller.
Механизм маршрутизации MVC будет автоматически направлять контроллеры в ClassLibrary, а контроллеры автоматически построят представления из исходного проекта MVC, при условии, что у вас есть ссылки и использование правильно.
Я использую эту архитектуру для реализации модуля отчетов Html, который можно скомпилировать и развернуть отдельно от основного решения. Наконец-то я свободен от SSRS!
источник