У меня странная проблема с пользовательским веб-элементом управления в приложении форм ASP.NET.
Для веб-приложения я подумал, что это сэкономит мне много времени на создание класса, которыйнаследуется от CompositeControl
, который объединяет метку с другим элементом управления, таким как TextBox
или DropDownList
.Этот составной элемент управления имеет несколько свойств, которые обертывают свойства базовых свойств (например: EnteredText wraps TextBox.Text
).Элементы управления могут использоваться для привязки данных точно так же, как и обычные, но вместо txtBox.Text = someObject.someProperty
вы используете compositeControl.EnteredText = someObject.someProperty
.Затем эти элементы управления используются на страницах ASPX и пользовательских элементах управления ASCX.
Первая версия веб-элементов управления написана на C # и отлично работает.Эти элементы управления размещены на App_Code folder
веб-сайта.Тем не менее, эта папка становилась довольно большой, и из-за политики мне пришлось писать все в VB.NET, поэтому я решил создать библиотеку классов, чтобы поместить туда версию элементов управления VB.NET, чтобы у меня не былочтобы перевести все веб-приложение на VB.NET, но только элементы управления.
Однако версия VB.NET не работает.Когда я нажимаю на ссылку в GridView
, она открывает всплывающее окно и правильно заполняет все текстовые поля.Если закрыть экран и щелкнуть какую-либо другую ссылку из той же сетки, поля не будут заполнены должным образом, и данные из первой обратной передачи будут видны в полях.При использовании отладчика я вижу, что все поля заполнены правильными данными, и на этапе рендеринга свойство Text базового TextBox
показывает все новые данные.Это просто не показывает это на экране.Извлечение данных после обратной передачи, как при нажатии кнопки сохранения, работает как обычно.
Когда я помещаю элемент управления из App_Code folder
на той же странице, он работает как положено и показывает новые данные, а неданные из предыдущего постбэка.
Вот два URL-адреса для вставки, первый - в рабочую версию C #, а второй - в версию VB.NET.
C # версия: http://pastebin.com/SuWaHrMt
VB.NET версия: http://pastebin.com/9aeV7St1
Вот пример того, как он используется в файле ASCX:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CustomControl.ascx.cs" Inherits="Controls_CustomControl" %>
<%@ Register Namespace="UI.CompositeControls" TagPrefix="cs" %>
<cs:TextBoxWithLabel ID="TextBoxWithLabel1" runat="server" LabelText="Voornaam" />
<cc:LabeledTextBox ID="tbwlVoornaam" runat="server" LabelText="Voornaam" />
Префикс cc указан в web.config:
<pages theme="Default" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">
<controls>
<add assembly="CompositeControls" namespace="CompositeControls" tagPrefix="cc" />
</controls>
<namespaces>
<add namespace="CompositeControls" />
</namespaces>
</pages>
Что мне здесь не хватает, что делает версию C # работающей, а версию VB нет?
Заранее спасибо!Не стесняйтесь задавать вопросы, если вам нужны пояснения.
Обновление: я отключил ViewState на соответствующем ASCX, и он работает:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CustomControl.ascx.cs" EnableViewState="false" Inherits="Controls_CustomControl" %>
Мой коллега нашел следующий фрагмент:
Если вы повторно вставляете элементы управления с каждым циклом, каждое поколение динамически созданных элементов управления будет получать значения свойств из состояния просмотра предыдущего набора элементов управления.Во многих случаях вы можете избежать этой проблемы, установив для свойства EnableViewState элемента управления контейнера значение false.В этом случае информация о динамических элементах управления не сохраняется, и нет конфликта с последовательными версиями элементов управления.
Я просто не уверен, как это внезапно применимо к элементам управления.Основываясь на этой статье MSDN о ViewState Я предполагаю, что это происходит потому, что элементы управления добавляются в метод CreateChildControls, который происходит после событий обратной передачи.
Может кто-нибудь объяснить, что именно происходитВот?