Можно ли получить доступ к MVC Views, расположенным в другом проекте?
Я хочу разделить мой проект MVC на несколько проектов
Итак, в первую очередь, я создал два проекта Фронт и Виды
Проект Фронт - это веб-приложение, содержащее контроллеры и модели.
Проект Представления - это проект библиотеки классов, который будет содержать только представления
Мой вопрос в том, как я могу заставить контроллеры вызывать представления, расположенные в проекте Представления
У меня есть такие контроллеры, как этот:
public ActionResult Default()
{
return this.View();
}
Ответы
Ответ 1
MVC не компилирует представления в DLL, а ссылается на них как файлы из корневого каталога вашего сайта. Местом, по соглашению, является ~/Views и отслеживается путь поиска. Это более или менее жестко закодировано в механизмах просмотра по умолчанию.
Поскольку представления - это файлы, когда вы разбиваете их на отдельный проект, они не будут существовать в вашем основном проекте веб-приложений. Таким образом, механизм просмотра не может их найти. При компиляции приложения любые ссылки на проекты будут копировать только DLL (и, возможно, несколько других вещей, например, pdb и т.д.).
Теперь есть способы обойти это, но, честно говоря, они обычно больше проблем, чем того стоят. Вы можете заглянуть в "Переносные области" в проекте mvc contrib, но они не очень хорошо поддерживаются и говорили о замене их упаковкой NuGet.
Вы также можете следить за советом @mo.esmp и создавать настраиваемый механизм просмотра, но вам все равно нужно выяснить способы копирования представлений, где сайт может получить к ним доступ после сборки и/или развертывания.
Мое предложение состояло бы в том, чтобы НЕ выпускать проекты так, как вы описываете. Я не вижу в этом никакой ценности. Если ваш проект станет таким большим, я бы вместо этого разделил ваш код на области и сохранил все ваши региональные коды и данные вместе.
Какое значение существует при разделении элементов, которые явно зависят друг от друга в отдельных сборках, которые предназначены только для сбора вещей в зависимости от их назначения? Я вижу некоторую ценность в разделении моделей на собственный проект, поскольку модели могут использоваться более чем одной сборкой. Однако контроллеры и представления используются только на основном сайте MVC.
Ответ 2
Для включения контроллеров вам необходимо изменить регистрацию маршрута, чтобы сообщить им, где искать контроллеры:
routes.MapRoute(name: "Default", url: "{controller}/{action}/{id}",
namespaces: new[] {"[Namespace of the Project that contains your controllers]"},
defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional});
для включения View вы создаете пользовательский ViewEngine:
public class CustomViewEngine: RazorViewEngine
{
public CustomViewEngine()
{
MasterLocationFormats = new string[]
{
"~/bin/Views/{1}/{0}.cshtml",
"~/bin/Views/{1}/{0}.vbhtml",
"~/bin/Views/Shared/{0}.cshtml",
"~/bin/Views/Shared/{0}.vbhtml"
};
ViewLocationFormats = new string[]
{
"~/bin/Areas/{2}/Views/{1}/{0}.cshtml",
"~/bin/Areas/{2}/Views/{1}/{0}.vbhtml",
"~/bin/Areas/{2}/Views/Shared/{0}.cshtml",
"~/bin/Areas/{2}/Views/Shared/{0}.vbhtml"
};
.
.
.
}
}
protected void Application_Start()
{
ViewEngines.Engines.Add(new CustomViewEngine());
для получения дополнительной информации см. стандартную реализацию RazorViewEngin.
Вот несколько хороших статей:
Сохранение контроллеров и представлений ASP.NET MVC в отдельных сборках
ASP.NET MVC: установка ваших контроллеров в отдельную сборку
Как вызвать контроллеры во внешних сборках в приложении ASP.NET MVC
Ответ 3
Вы можете предварительно скомпилировать свои представления - таким образом они включены в dll, и вы можете ссылаться на них из другого проекта.
Как это сделать:
- Переместить представления в другой проект
- Установка расширения Razor Generator в Visual Studio
- Измените настраиваемый инструмент на RazorGenerator для тех
просмотры
- Добавить пакет RazorGenerator.Mvc NuGet в проект вида
- Проект справочного представления из вашего основного проекта
Что это!
Хотя вам нужно что-то сделать с вашими моделями, либо соединить их вместе с представлениями, либо создать для них третий проект, иначе вы будете иметь круговую зависимость.
Другим недостатком является то, что всем, кто будет работать с представлениями, потребуется расширение Razor Generator.
Как это работает, в основном вы делаете Visual Studio генерировать файлы .cs из ваших представлений во время разработки, и они являются частью скомпилированной DLL, как и любой другой фрагмент кода.