Совместное использование просмотров Razor по проектам

Я хочу разделить макет (заголовки, навигация и нижние рамки) в нескольких проектах ASP.NET MVC. Как я могу это сделать?

Можно ли создать пакет NuGet для обертывания общих файлов Razor, изображений и CSS?

Ответы

Ответ 1

Три подхода:

  • Поделитесь исходным кодом представления Razor с помощью вашей системы управления версиями.
  • Скомпилируйте представления в отдельный DLL файл для совместного использования двоичных файлов.
  • Создайте пакет NuGet

См. Скомпилируйте представления ASP.NET MVC Razor в отдельную DLL для того, как вы делаете вариант 2.

Для опции 3 см. Создание и публикация пакета.

На самом деле, я думаю, что это оригинальная статья о том, как скомпилировать представления Razor: Предварительно скомпилируйте представления MVC Razor с помощью RazorGenerator

Ответ 2

Я ударил это более одного раза через Google сейчас, и хотя я бы поставил другое решение (которое, IMO, намного безопаснее и управляемо, чем использование прекомпиляторов и пакетов).

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

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

Вот что я бы рекомендовал:

Щелкните правой кнопкой мыши по решению и создайте новую папку решений с именем Common Javascript Files (или все, что вы хотите называть.

New Solution Folder

Common Javascript Files Solution Folder

Щелкните правой кнопкой мыши на Solution, выберите Open Folder в Проводнике Windows, или перейдите туда вручную для других версий Visual Studio: (

Open Folder In Windows Explorer

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

Common Javascript Files Directory

В этом новом каталоге добавьте файлы, которые необходимо разделить между решениями.

Add Javascript Files To Directory

В Visual Studio выберите папку решений и выберите Добавить - Существующий элемент.

Visual Studio Add - Existing Itme

В диалоговом окне выбора файлов перейдите в каталог, созданный ранее, выберите файлы, добавленные в каталог, и нажмите "Добавить".

Select Files To Add

Solution Folder Files

В каждом проекте, для которого требуется общий файл, щелкните правой кнопкой мыши проект (или каталог в проекте) и нажмите "Добавить - существующий элемент".

Project Add Existing Item

Перейдите в общий каталог, выберите файлы и щелкните стрелку раскрывающегося списка, затем нажмите "Добавить как ссылку".

Add As Link

Теперь файлы в проектах существенно сокращаются до файлов в папке Solution. Но они рассматриваются как фактические файлы в проекте (включая файлы .CS или Visual Basic, они будут скомпилированы как файлы, которые действительно существуют в проекте).

Linked Files

ПРОФИ

  • Файлы по-настоящему доступны для разных проектов во время разработки
  • Можно добавить только файлы, необходимые для каждого проекта, это не все или ничего
  • Не требуется настройка в IIS (виртуальный каталог и т.д.)
  • Если решение находится в TFS Source control, вы можете добавить каталог в источник TFS, и файлы с общим доступом будут контролироваться исходным кодом.
  • Редактирование файла, выбрав его в проекте, отредактирует фактический файл.
  • Удаление связанного файла не удаляет файл.
  • Это не только файлы JS, связанные файлы могут быть ЛЮБЫМ файлом, который вам может понадобиться (изображения, Css, Xml, CS, CSHTML и т.д.)

CONS

  • Каждое развертывание получает собственный файл.
  • Существует небольшая кривая обучения при понимании того, что папки решений не являются каталогами, которые существуют в каталоге решений.

И - украсть у вас еще один ответ для консолидации информации, вот как вы их получите для вывода для отладки (взято из комментария ниже скребкового ответа, ссылка на сообщение блога для цели сборки для вывода для отладки)

Добавьте это в каждый проект проекта-потребителя .csproj:

  <Target Name="CopyLinkedContentFiles" BeforeTargets="Build">
    <Copy SourceFiles="%(Content.Identity)" 
          DestinationFiles="%(Content.Link)" 
          SkipUnchangedFiles='true' 
          OverwriteReadOnlyFiles='true' 
          Condition="'%(Content.Link)' != ''" />
 </Target>

Ответ 3

Появились новые возможности (IMHO). Я бы предпочел организовать его как Feature сращивания в ASP MVC Core, это сэкономит много времени по дороге, я бы рекомендуем в 2 этапа.

  • Во-первых, организуем/помещаем в него область под названием Features splices MSDN ref. подключите его как в статье и хорошо объясните.

    // you're telling ASP that you've other Feature areas that it should look public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations) { // Error checking removed for brevity var controllerActionDescriptor = context.ActionContext.ActionDescriptor as ControllerActionDescriptor; string featureName = controllerActionDescriptor.Properties["feature"] as string; foreach (var location in viewLocations) { yield return location.Replace("{3}", featureName); } }

  • Во-вторых, встроить Особенности в Shared project или Portable Libraries. Я добавил ссылки на как это сделать от Р. Уильямса и MSDN.

Итак, поскольку у вас уже есть это в общей области, рассмотрите его как функцию и встройте в портативный lib или общий проект. Хорошая статья Р. Уильямса.

введите описание изображения здесь