【问题标题】:Precompilation of aspx and cshtml pages, but leaving the master or layout pages updateable预编译 aspx 和 cshtml 页面,但保留主页面或布局页面可更新
【发布时间】:2018-12-19 11:16:44
【问题描述】:

不确定我所追求的是否可以使用 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>

它引用了Skinable 文件夹中的母版页文件Skin.MasterSkin.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 文件生成到 构建文件夹)。当我们将母版页复制到 部署文件夹,对该文件的更改将被忽略(它只是使用 编译时的母版页)。

  • 如果我在运行 aspnet_compiler (attrib +h d:\SourceFolder\Skinable) 之前隐藏 Skinable 文件夹,那么我会得到与上面相同的结果(即通过 -x 标志排除时)

  • 如果我在运行时指定 -u 标志(可更新) aspnet_compiler.exe,好吧,我不确定这样做的好处是什么 老实说,因为在那种情况下似乎没有任何东西被编译,所以 当您请求页面时,编译会即时进行,所以是什么 重点……

  • 最后,如果我允许编译所有内容,然后进入 bin 文件夹和 DELETE skin.master.compiled,然后当你请求一个 使用该母版页的页面,您会收到错误“文件 ‘Skin.master’未预编译,无法请求”

我怀疑对母版页的引用是这里的问题 - 即,如果一个页面引用了一个母版页,那么如果您想编译该页面,则该母版页也必须被编译,但我不确定。我是不是在这里一无所有?

【问题讨论】:

  • 您可以使用可更新的用户界面标志 -u:updatable docs.microsoft.com/en-us/aspnet/web-forms/overview/… 重新编译。解决了一半的问题。
  • 感谢@DipenShah。使用 -u 标志编译似乎使资产可更新,这很好,但它似乎并没有真正编译资产,因此它们可以在不需要编译的情况下加载到服务器上。或者我在这里错过了什么? -u 似乎只是一个编译检查,以确保没有遇到运行时错误?或者,我错过了什么吗?
  • -u 标志不编译 aspx 文件,它只编译文件后面的所有代码,因此您的 aspx 文件将根据请求进行编译。这就是为什么我说这只是解决您问题的一半
  • 如果有一个源网络应用程序,一切都可以更新,但只有整个预编译的网络应用程序被部署。如果管理员更改了皮肤,他会更改源 Web 应用程序中的皮肤,修改后的源 Web 应用程序会被预编译并再次部署......?!像这样的东西可以吗?
  • 但是如何防止用户在母版页代码中运行 C# 代码?

标签: asp.net .net webforms aspnet-compiler


【解决方案1】:

如果你换一种方式呢?如果您“捕获”了他们的 html 和 css 更改,然后为该公司创建了一个新的 css 文件夹或文件怎么办? (文件是原始文件加上它们的更改。然后,当加载母版页时,它会从数据库中提取公司使用的文件或文件夹,并将其从母版页的 c# 写入 css?

流程如下:

  • 捕捉他们的变化
  • 创建一个 css 文件夹和文件,就像原始文件一样,但要进行更改
  • 从数据库表中提取要使用的css文件。(您需要制作一个client->css文件的映射表)
  • 使用母版页 c# 将要使用的 css 文件写入 html。

本质上,这会在运行时根据您的 客户端,您不必担心编译。

我们成功地使用了这个过程来为不同的颜色蒙皮。 我们的文件夹系统是这样的:

  • 默认 -> 原始 Css 文件
  • 深色主题 -> 带有深色变化的原创
  • 蓝色主题
  • 粉色主题等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2021-09-14
    • 2014-07-24
    相关资源
    最近更新 更多