Пользовательский шаблонный элемент управления ASP.NET - есть ли способ изменить, куда выводятся данные с привязкой к данным? - PullRequest
1 голос
/ 31 августа 2010

По сути, у меня есть пользовательский шаблонный элемент управления с пользовательским классом контейнера данных.Когда разработчик добавляет экземпляр моего элемента управления на страницу, он может определить элементы управления в шаблоне LayoutTemplate так, как ему нравится:

    <ml:MyControl id="MyControl1" runat="server">
        <LayoutTemplate>
            <span><%#Container.ErrorMessage%></span>
        </LayoutTemplate>
    </ml:MyControl>

Этот пример отображается на странице следующим образом:

<span id="MyControl1"><span>
            <span>ml_errormessage</span>

        </span></span>

Я бы хотел, чтобы мой элемент управления автоматически перемещал "ml_errormessage" (содержимое с привязкой к данным из Container.ErrorMessage - жестко закодированный токен в свойстве) в класс содержащего его элемента, чтобы упростить jQuery использование селектора.найти элемент и динамически вставить сообщение об ошибке на стороне клиента.Что еще более важно, мне бы хотелось, чтобы оно было удалено, чтобы имя класса не заменялось содержимым, и jQuery может найти его столько раз, сколько потребуется в течение жизненного цикла страницы.Другими словами, я хотел бы, чтобы выходные данные выглядели так, чтобы разработчик не изменил шаблон ввода или не использовал пользовательские элементы управления в шаблоне:

<span id="MyControl1"><span>
            <span class="ml_errormessage"></span>

        </span></span>

Я хотел бы переместить значение с помощью коллекции элементов управленияа не прибегать к разбору строк в выводе, если это возможно.Однако, когда я запрашиваю коллекцию в переопределении OnPreRender, элемент управления в шаблоне выглядит в отладчике следующим образом:

{System.Web.UI.DataBoundLiteralControl}
System.Web.UI.DataBoundLiteralControl: {System.Web.UI.DataBoundLiteralControl}
AppRelativeTemplateSourceDirectory: "~/"
BindingContainer: {MyControls.MyControlData}
ClientID: "MyControl1_ctl01_ctl00"
Controls: {System.Web.UI.EmptyControlCollection}
EnableTheming: True
EnableViewState: True
ID: "ctl00"
NamingContainer: {MyControls.MyControlData}
Page: {ASP.default_aspx}
Parent: {MyControls.MyControlData}
Site: Nothing
SkinID: ""
TemplateControl: {ASP.default_aspx}
TemplateSourceDirectory: "/MyControls"
UniqueID: "MyControl1$ctl01$ctl00"
Visible: True

Как вы можете видеть, значение "ml_errormessage" нигде не найдено.После анализа события DataBind класса Control с использованием Reflector я вижу, что он делегирует поведение привязки каждому элементу управления.Другими словами, каждый элемент управления обрабатывает свою собственную привязку данных.Однако, поскольку у меня нет возможности заранее узнать, какие типы элементов управления будут в шаблоне, как это можно сделать?

Примечание: приемлемой альтернативой будет добавление нового HtmlGenericControl (span) вточное место, где находится ml_errormessage, и добавьте его в качестве класса к этому новому элементу управления.

Кстати, есть ли простой способ получить выходные данные элемента управления для отступа для удобства чтения во время отладки?

1 Ответ

1 голос
/ 31 августа 2010

Через несколько секунд после публикации я подумал о простом решении ... просто о жестком коде "<span class=""ml_errormessage""></span>" в результате моего свойства контейнера ErrorMessage.

Конечно, он добавляет дополнительный ненужный элемент <span>, но это также делает его более безопасным, если конечный разработчик решит добавить дополнительные элементы вместе со значением привязки к базе данных.

...