Предварительная компиляция страниц aspx и cshtml, но обновление страниц мастера или макета
Не уверен, что то, что я здесь сделаю, даже доступно с помощью инструмента aspnet_compiler.exe, но здесь идет:
У нас есть сайт, на котором мы разрешаем пользователям обходить скины, позволяя им изменять мастер-страницы, или, вернее, мы не позволяем им напрямую их изменять, мы даем им урезанный "стиль разметки", который они могут использовать для изменения html этих страниц, поэтому они могут по существу "скрыть" сайт, чтобы они выглядели как их собственный интерфейс.
Я стараюсь оптимизировать сайт, предварительно скомпилировав представления и страницы aspx. Но я хочу, чтобы макет и мастер-страницы отображали эти представления и страницы, чтобы они оставались обновляемыми. Однако я не могу заставить это работать...
Скажем, у нас есть следующая страница aspx:
<%@ Page Title="Hello World" MasterPageFile="~/Skinable/Skin.Master" Language="C#" AutoEventWireup="true" CodeBehind="HelloWorld.aspx.cs" Inherits="Project.HelloWorld" %>
<asp:Content ID="Content1" ContentPlaceHolderID="Content" Runat="server">
Hello World!
</asp:Content>
Какая ссылка на файл главной страницы Skin.Master
в папке Skinable
. Skin.Master
должен быть обновляемым. Вот что я пробовал:
-
Если я просто скомпилирую сайт с помощью этой команды aspnet_compiler.exe, главная страница тоже будет скомпилирована и не обновляется:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_compiler.exe -v / -p d:\SourceFolder d:\CompiledSite
-
Если я исключаю скин-папку (добавив -x Skinable
к команде) в файле aspnet_compiler.exe, папка не будет скопирована в выходную папку, но главная страница все еще будет скомпилирована в папку bin (то есть, skin.master.compiled
файл skin.master.compiled
генерируется в папку сборки). И когда мы копируем главную страницу в папку развертывания, изменения в этом файле игнорируются (она просто использовала главную страницу, как это было во время компиляции).
-
Если я скрою папку Skinable перед запуском aspnet_compiler (присваиваю attrib +h d:\SourceFolder\Skinable
), то я получаю тот же результат, что и выше (т.е. При исключении через флаг -x),
-
Если я укажу флаг -u (Updatable) при запуске aspnet_compiler.exe, ну, я не уверен, что преимущество этого в том, чтобы быть честным, поскольку в этом случае ничего не получается скомпилировано, поэтому компиляция происходит на летать, когда вы запрашиваете страницу, так что в чем смысл...
-
Наконец, если я разрешаю компиляцию всего, а затем заходим в папку bin и DELETE skin.master.compiled, тогда, когда вы запрашиваете страницу, использующую эту главную страницу, вы получаете ошибку "Файл" Skin.master "не имеет были предварительно скомпилированы и не могут быть запрошены "
Я подозреваю, что ссылка на главную страницу является проблемой здесь - то есть, если страница ссылается на главную страницу, тогда эта главная страница ДОЛЖНА также быть скомпилирована, если вы хотите скомпилировать страницу, но я не уверен. Неужели я здесь ничего не скрываю?
Ответы
Ответ 1
Что, если ты пошла по-другому? Что делать, если вы "захватили" свои html и css изменения, а затем создали новую папку или файл css для этой компании? (файл - это оригинал плюс их изменения. Затем, когда главная страница загружается, она извлекает из базы данных какой файл или папку использует компания и записывает ее в css с главной страницы С#?
Процесс будет выглядеть так:
- Захват их изменений
- Создайте css-папку и файлы так же, как оригиналы, но с их изменениями
- Извлеките из таблицы базы данных файл css для использования. (Вам нужно будет сделать таблицу сопоставления client-> css файла)
- Используйте главную страницу С# для записи в html, который должен использовать файл css.
По сути, это приводит к тому, что изменения css загружаются во время выполнения на основе вашего клиента, и вам не нужно беспокоиться о компиляции.
Мы успешно использовали этот процесс для скининга разных цветов. Наша система папок была такой:
- По умолчанию → Исходные файлы Css
- Темная тема → Оригинал с темными изменениями
- Синяя тема
- Розовая тема и т.д.