当您预编译但不合并时,页面和用户控件将在哪里结束
本文关键字:用户 控件 结束 在哪里 编译 合并 | 更新日期: 2023-09-27 18:09:42
发布网站时,您有几个预编译选项。对于这个例子,我们假设它是.ascx用户控件(尽管页面行为类似(,并且"允许预编译站点可更新"是而不是选中的。以下是您的一些选择:
- 不预编译:用户控件内容保留在.ascx文件中,并根据需要编译到临时ASP.NET文件夹中
- 预编译,没有合并:主DLL(projectName.DLL(略有不同,.ascx消失,我在任何地方都找不到ascx内容
- 预编译,合并到单个程序集:主DLL略有不同,.ascx内容在新的单个程序集中,并显示.compiled文件
- 预编译,将页面和控件合并到单个程序集:与#3几乎相同,单个程序集稍小(可能不包括顶级程序集(,包括一些代码#3(与#3相同,但现在我们也有.compiled文件
方法:我使用WinMerge比较#1和#2、#2和#3之间的发布输出,依此类推。我还从一个ascx中选择了一个唯一的单词,并使用Agent Ransack搜索发布输出(查找所有内容,而不仅仅是索引内容(。
问题:对于#2,用户控制HTML内容的最终目的是什么?或者换句话说,如果没有DLL中已发布的ascx内容或.compiled文件,网站如何工作?对于#1,它根据需要从.ascx中获取内容,但#2没有可用的内容。
编辑:在我询问后,网站立即变为只读,我意识到我的构建输出无效。我已经更新了这个问题,使其更加准确和彻底。
它以某种方式或另一种最终出现在已发布bin文件夹中的生成.dll中
.aspx和.ascx文件生成控制对象树,所有字符串都在%>aaa<%之间被转换为Literal("aaa"(,并在正确的位置插入到控制树中。
这些从Page(或您选择的基类Page(和WebUserControl派生的类总是经过编译的,但没有预编译,它们位于临时asp.net文件夹中;对于预编译,它们会立即放在预编译包中。
例如以下.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>
<div class="customhtml">
<asp:Label ID="Label1" runat="server" Text="<%#Page.Title %>"></asp:Label>
<asp:Button ID="Button1" runat="server" Text="Button" />
</div>
结果如下(选项"无合并"(:webusercontrol.ascx.#hash#.编译的
<?xml version="1.0" encoding="utf-8"?>
<preserve resultType="3" virtualPath="/WebSite1/WebUserControl.ascx" hash="fffffff7f6e43006" filehash="8f74adc78f7714d1" flags="110000" assembly="App_Web_aslslubn" type="ASP.webusercontrol_ascx">
<filedeps>
<filedep name="/WebSite1/WebUserControl.ascx" />
<filedep name="/WebSite1/WebUserControl.ascx.cs" />
</filedeps>
</preserve>
它允许您找到它被编译到的程序集-App_Web_#hash#并键入-ASP.webusercontrol_ascx
分解它显示以下类声明:
using System;
using System.Diagnostics;
using System.Globalization;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace ASP
{
public class webusercontrol_ascx : WebUserControl
{
private static bool __initialized;
[DebuggerNonUserCode]
public webusercontrol_ascx()
{
this.AppRelativeVirtualPath = "~/WebUserControl.ascx";
if (webusercontrol_ascx.__initialized)
return;
webusercontrol_ascx.__initialized = true;
}
[DebuggerNonUserCode]
private Label __BuildControlLabel1()
{
Label label = new Label();
this.Label1 = label;
label.ApplyStyleSheetSkin(this.Page);
label.ID = "Label1";
label.DataBinding += new EventHandler(this.__DataBindingLabel1);
return label;
}
public void __DataBindingLabel1(object sender, EventArgs e)
{
Label label = (Label) sender;
Control bindingContainer = label.BindingContainer;
label.Text = Convert.ToString(this.Page.Title, (IFormatProvider) CultureInfo.CurrentCulture);
}
[DebuggerNonUserCode]
private Button __BuildControlButton1()
{
Button button = new Button();
this.Button1 = button;
button.ApplyStyleSheetSkin(this.Page);
button.ID = "Button1";
button.Text = "Button";
return button;
}
[DebuggerNonUserCode]
private void __BuildControlTree(webusercontrol_ascx __ctrl)
{
IParserAccessor parserAccessor = (IParserAccessor) __ctrl;
parserAccessor.AddParsedSubObject((object) new LiteralControl("'r'n<div class='"customhtml'">'r'n "));
Label label = this.__BuildControlLabel1();
parserAccessor.AddParsedSubObject((object) label);
parserAccessor.AddParsedSubObject((object) new LiteralControl("'r'n "));
Button button = this.__BuildControlButton1();
parserAccessor.AddParsedSubObject((object) button);
parserAccessor.AddParsedSubObject((object) new LiteralControl("'r'n</div>'r'n"));
}
[DebuggerNonUserCode]
protected override void FrameworkInitialize()
{
base.FrameworkInitialize();
this.__BuildControlTree(this);
}
}
}
特别是你可以发现你的HTML代码作为LiteralControl被添加到
[DebuggerNonUserCode]
private void __BuildControlTree(webusercontrol_ascx __ctrl)
{
IParserAccessor parserAccessor = (IParserAccessor) __ctrl;
parserAccessor.AddParsedSubObject((object) new LiteralControl("'r'n<div class='"customhtml'">'r'n "));
Label label = this.__BuildControlLabel1();
parserAccessor.AddParsedSubObject((object) label);
parserAccessor.AddParsedSubObject((object) new LiteralControl("'r'n "));
Button button = this.__BuildControlButton1();
parserAccessor.AddParsedSubObject((object) button);
parserAccessor.AddParsedSubObject((object) new LiteralControl("'r'n</div>'r'n"));
}