Я нашел лучшее решение, указанное после моего оригинального
Я нашел обходной путь.
Кажется (из-за отсутствия ответа и отсутствия результатов, когда я ищу этот термин), подавляющее большинство людей не знают об атрибутах эксплора и их полезности. Вы знаете, когда добавляете элементы управления проверкой на страницу ASP.NET, и у вас появляется довольно большой, выглядящий блок JavaScript в нижней части страницы, который устанавливает несколько свойств (таких как enabled и errormessage)? Это то, что я имею в виду. Они могут быть выведены на страницу с помощью метода Page.ClientScript.RegisterExpandoAttribute () - по сути, они должны сделать вашу разметку допустимым HTML, в то же время позволяя вам добавить дополнительные (значимые) свойства для использования с javascript. Они добавляются и могут быть доступны через HTML DOM, но на самом деле их нет в HTML.
В любом случае, вернемся к моему решению. Я просто добавил 2 литеральных элемента управления в usercontrol - один в самом начале и один в самом конце, и в codebehind я добавил разметку для элемента управления с идентификатором usercontrol (так как usercontrol не выводит один) , Таким образом, разметка выглядит так:
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="CreditCardInput.ascx.vb" Inherits="BVModules_Controls_CreditCardInput" %>
<asp:Literal ID="litControlBegin" runat="server" />
<!-- User Control Content Here -->
<asp:Literal ID="litControlEnd" runat="server" />
Тогда в коде позади я сделал это:
Me.litControlBegin.Text = String.Format("<div id=""{0}"" class=""creditcardinput"">", Me.ClientID)
Me.litControlEnd.Text = "</div>"
Теперь в HTML будет существовать элемент, соответствующий идентификатору (ClientID) UserControl. По сути, это дает мне уникальное пространство имен для добавления атрибутов expando - и способ для других элементов управления легко идентифицировать эти атрибуты и связать их с моим usercontrol. Атрибут expando добавляется с помощью этого кода:
Page.ClientScript.RegisterExpandoAttribute(Me.ClientID, "validatorsenabled", Me.ValidatorsEnabled)
Который больше не падает, благодаря элементу HTML, который я добавил вручную. Было бы неплохо, если бы сантехника была в пользовательском контроле, чтобы позаботиться об этой детали, как это происходит с серверным элементом управления, но этот обходной путь является подходящей заменой.
Лучшее решение
Как всегда, когда вам приходится прибегать к разбору строк, вам следует присмотреться, есть ли лучший способ. На этот раз было одно - переопределить метод Render (точно так же, как серверный элемент управления) и использовать встроенные методы в HtmlTextWriter для получения выходных данных.
Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
writer.AddAttribute(HtmlTextWriterAttribute.Id, Me.ClientID)
writer.RenderBeginTag(HtmlTextWriterTag.Div)
MyBase.Render(writer)
writer.RenderEndTag()
End Sub
Это функционально эквивалентно коду в моем другом решении - он создает тег DIV с идентификатором моего usercontrol. Тем не менее, он не требует, чтобы дополнительный код находился в Page_Load, как это сделал оригинал, лучше использует инфраструктуру и не требует форматирования или объединения строк.
Теперь эта строка добавит атрибут expando (в javascript) непосредственно в usercontrol:
Page.ClientScript.RegisterExpandoAttribute(Me.ClientID, "validatorsenabled", Me.ValidatorsEnabled)