Как добавить атрибут расширения в пользовательский элемент управления? - PullRequest
5 голосов
/ 27 февраля 2011

Я встраиваю некоторые пользовательские функции javascript в существующий пользовательский контроль ASP.NET.Usercontrol должен знать о свойстве элемента управления, в который он вложен. Итак, я остановился на использовании атрибута expando, а не глобальной переменной javascript, например:

Page.ClientScript.RegisterExpandoAttribute(Me.ClientID, "validatorsenabled", Me.ValidatorsEnabled)

Однако, несмотря на расширениеправильно выводится клиенту, сам пользовательский контроль не имеет соответствующего элемента в HTML.Итак, следующий JavaScript, автоматически генерируемый ASP.NET, получает ошибку «объект нулевой»:

var ctl00_MainContentHolder_Payment_CreditCardInput1 = document.all ? document.all["ctl00_MainContentHolder_Payment_CreditCardInput1"] : document.getElementById("ctl00_MainContentHolder_Payment_CreditCardInput1");
ctl00_MainContentHolder_Payment_CreditCardInput1.validatorsenabled = "False";

Я провел небольшое исследование и обнаружил эту страницу , указывающую, что реализация IWebPartИнтерфейс мог бы сделать это, но я попытался безуспешно.

Есть ли способ сделать вывод пользовательского контроля тегом, подобным серверному элементу управления?Или это единственный вариант преобразования всего этого в серверный элемент управления (что в данном случае идет вразрез с дизайном веб-сайта)?

Я открыт для других предложений по объявлению общего свойства JavaScript в пользовательском элементе управленияесли у кого-то есть другие идеи.

1 Ответ

2 голосов
/ 28 февраля 2011

Я нашел лучшее решение, указанное после моего оригинального

Я нашел обходной путь.

Кажется (из-за отсутствия ответа и отсутствия результатов, когда я ищу этот термин), подавляющее большинство людей не знают об атрибутах эксплора и их полезности. Вы знаете, когда добавляете элементы управления проверкой на страницу 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)
...