Почему Page.ParseControl не создает элемент управления, унаследованный от правильного базового класса?
Я динамически создаю пользовательский элемент управления из XML через XSLT. Вывод - это строка с таким содержимым:
<%@ Control Language="C#" AutoEventWireup="true" Inherits="Library.Web.UI.GeneratedFormBase, MyAssembly" %>
<div class="myCssClass">
<asp:TextBox ID="d" runat="server" OnTextChanged="OnTextChanged" />
<asp:Label runat="server" AssociatedControlID="SomeName" AccessKey="n">Label Text</asp:Label>
<asp:TextBox ID="SomeName" runat="server" OnTextChanged="OnTextChanged" />
<asp:Label runat="server" AssociatedControlID="SomeOtherName">Welcome</asp:Label>
<asp:TextBox ID="SomeOtherName" runat="server" OnTextChanged="OnTextChanged" />
<asp:Button ID="OK" runat="server" OnClick="ButtonClick" Text="Save" />
</div>
Теперь я использую Page.ParseControl(theGeneratedString) для динамического создания этого элемента управления.
Тип, который объявлен в Inherits
существует и может быть найден. Если я объявлю другой (т.е. не существующий) тип там, Parser Error
Исключение выдается, поэтому я полностью убежден, что анализатор ищет этот тип и находит его.
Тем не менее, контроль, который генерируется из ParseControl
имеет тип System.Web.UI.Control, а не элемент управления, который указан (и, очевидно, также проанализирован и расположен) в объявлении Inherits.
Почему это так и как я могу гарантировать, что элемент управления имеет правильный тип?
1 ответ
Хорошо, после использования небольшого рефлектора кажется очевидным, почему Control принадлежит "неправильному" классу. Так что ParseControl - просто неправильный метод для этого. Правильным является LoadControl, но для его использования мне нужно предоставить сгенерированную форму через VirtualPathProvider. Таким образом, для правильного анализа элемента управления требуется гораздо больше усилий, но при использовании этого подхода элемент управления загружается, анализируется, компилируется и выводится из правильного типа.