Присоединение JavaScript к прототипу экземпляра на стороне клиента ASCX - PullRequest
0 голосов
/ 03 августа 2011

Как я могу кодировать свой элемент управления ASCX, чтобы я мог дать идентификатор и из браузера запустить некоторый JavaScript, такой как

$find('myASCXControlClientId')

и возвращенный объект имеет класс с прототипом с моими пользовательскими методами javascript, которые можно вызывать в указанном экземпляре элемента управления?

Элементы управления Telerik, такие как RadTreeView, могут сделать это, например,

enter image description here

Элемент управления, который они получают с Javascript, имеет прототип с некоторыми четко определенными методами. Как я могу сделать это с ASCX?

1 Ответ

1 голос
/ 03 августа 2011

RadControl, который вы показываете выше, может быть реализован как ScriptControl вместо UserControl (с дополнительным файлом .ascx).

Возможно, вы уже знаете, что класс ScriptControl делаетименно то, что вы спрашиваете, и когда вы делаете $find(elementid), он возвращает фактический объект javascript элемента управления.

Проблема, которую я ненавижу с ScriptControl, заключается в том, что вам в основном приходится создавать элементы DOM вашего элемента управления программно, добавляяОбъекты .NET, такие как Table и Label, в коллекцию ChildControls вашего элемента управления во время Load или PreRender

Одна из работ, которую я видел, заключается в создании ScriptControl, который содержит ваши свойстваи методы, а затем оберните это с помощью ascx UserControl:

ScriptControl Пример:

public class MyScriptControl : System.Web.UI.ScriptControl
{
    public string MyProperty { get; set; }

    protected override IEnumerable<ScriptDescriptor> GetScriptDescriptors()
    {
        //your implementations
    }

    protected override IEnumerable<ScriptReference> GetScriptReferences()
    {
        //your implementations
    }
}

UserControl Пример:

public partial class MyUserControl : System.Web.UI.UserControl
{        
    protected override void OnLoad(EventArgs e)
    {
        this.MyLabel.Text = this.MySpecialScriptControl.MyProperty;

        base.OnLoad(e);
    }
}

.ascx Пример:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Example.ascx.cs" Inherits="Example" %>

<div>
    <asp:Label id="MyLabel" runat="server" />
    <my:MyScriptControl id="MySpecialScriptControl" runat="server" />
</div>

Это должно позволить вам получить как контроль над разметкой ascx, так и возможность в javascript сделать что-то вроде:

var myScriptControl = $find('MySpecialScriptControl');
...