Где заканчиваются страницы и пользовательские элементы управления, когда вы прекомпилируете, но не объединяете?
При публикации сайта у вас есть несколько вариантов прекомпиляции. Для этого примера, давайте предположим, что это пользовательский элемент управления.ascx (хотя поведение страницы схоже), а параметр "Разрешить обновление скомпилированного сайта" не отмечен. Вот некоторые из вариантов, которые у вас есть:
- Не прекомпилировать: пользовательский контент управления остается в файле.ascx и компилируется по требованию во временные папки ASP.NET.
- Прекомпиляция, без слияния: основная DLL (projectName.dll) немного отличается, .ascx исчезает, и я нигде не могу найти содержимое ascx??
- Прекомпиляция, объединение в одну сборку: основная DLL немного отличается, содержимое.ascx находится в новой отдельной сборке, и появляются файлы.compiled
- Прекомпиляция, объединение страниц и элементов управления в одну сборку: почти идентична #3, одна сборка немного меньше (предположительно, она не включает сборки верхнего уровня), включается часть кода # 3) То же, что #3, но теперь у нас также есть.компилированные файлы.
Методология: я использовал WinMerge для сравнения результатов публикации между #1 и #2, затем # 2 и # 3 и так далее. Я также выбрал уникальное слово из одного ascx и искал выходные данные публикации, используя Agent Ransack (находит все, а не только проиндексированный контент).
Вопрос: для #2, где в конечном итоге пользователь контролирует контент HTML? Или, другими словами, как работает сайт без опубликованного содержимого ascx в DLL или без скомпилированных файлов? Для #1 он берет контент из.ascx по мере необходимости, но # 2 не имеет его в наличии.
Изменить: сайт пошел только для чтения сразу после того, как я спросил, и я понял, что мой вывод сборки был недействительным. Я обновил вопрос, чтобы быть более точным и тщательным.
1 ответ
Он попадает в созданный.dll в опубликованную папку bin тем или иным способом
Файлы.aspx и.ascx создают деревья объектов управления со всеми строками между%>aaa<%, которые преобразуются в литерал ("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#.compiled
<?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"));
}