Где заканчиваются страницы и пользовательские элементы управления, когда вы прекомпилируете, но не объединяете?

При публикации сайта у вас есть несколько вариантов прекомпиляции. Для этого примера, давайте предположим, что это пользовательский элемент управления.ascx (хотя поведение страницы схоже), а параметр "Разрешить обновление скомпилированного сайта" не отмечен. Вот некоторые из вариантов, которые у вас есть:

  1. Не прекомпилировать: пользовательский контент управления остается в файле.ascx и компилируется по требованию во временные папки ASP.NET.
  2. Прекомпиляция, без слияния: основная DLL (projectName.dll) немного отличается, .ascx исчезает, и я нигде не могу найти содержимое ascx??
  3. Прекомпиляция, объединение в одну сборку: основная DLL немного отличается, содержимое.ascx находится в новой отдельной сборке, и появляются файлы.compiled
  4. Прекомпиляция, объединение страниц и элементов управления в одну сборку: почти идентична #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"));
}
Другие вопросы по тегам