Я делаю меню, которое загружает уровни динамически, когда вы нажимаете на элемент, следующий уровень загружается асинхронно. Для каждого пункта меню у меня есть пользовательский элемент управления. Каждый пользовательский элемент управления объявляется в его родительском элементе, например, «secondlevelcontrol» имеет ссылку на «третий уровень управления».
С этим уровнем вложенности я хочу управлять асинхронными вызовами на каждом пользовательском элементе управления, поэтому, когда загружается первый уровень, загружается и JavaScript для загрузки второго уровня. Когда загружается второй уровень, загружается и JavaScript для загрузки третьего уровня.
Для выполнения асинхронных вызовов я реализую интерфейс ICallbackEventHandler. Как видно из примеров, элементы управления добавляются на страницу в виде обычного HTML. Метод ProcessOnLoadEvent выполняет все строки события «OnLoad» пользовательского элемента управления.
Примером реализации является пользовательский элемент управления четвертого уровня:
public string GetCallbackResult()
{
return _callbackRendering;
}
public void RaiseCallbackEvent(string itemId)
{
var id = Int32.Parse(itemId);
var menu = new LateralMenu();
var currentChildren = menu.GetNodesById(id, 1);
var ctrl = this.Page.LoadControl(USER_CONTROL_FIVE_LEVEL_RELATIVE_PATH) as LeftSideFifthLevel;
ctrl.Items = currentChildren.Children;
ctrl.ProcessOnLoadEvent();
_callbackRendering = ctrl.GetHtml();
}
А это код для пользовательского элемента управления пятого уровня:
public void ProcessOnLoadEvent()
{
EnsureChildControls();
if (null != RepeaterMenu)
{
SettingCallbackReference();
Visible = null != Items && 0 < Items.Count;
if (null != Items && 0 < Items.Count)
{
RepeaterMenu.DataSource = Items;
RepeaterMenu.DataBind();
}
}
}
public void RaiseCallbackEvent(string itemId)
{
var id = Int32.Parse(itemId);
var menu = new LateralMenu();
var currentChildren = menu.GetNodesById(id, 1);
var ctrl = this.Page.LoadControl(USER_CONTROL_SIX_LEVEL_RELATIVE_PATH) as LeftSideSixthLevel;
ctrl.Items = currentChildren.Children;
ctrl.ProcessOnLoadEvent();
_callbackRendering = ctrl.GetHtml();
}
public void SettingCallbackReference()
{
var cm = this.Page.ClientScript;
var cbRef = cm.GetCallbackEventReference(this, "itemId", "AnchorLevel5_OnClick_Callback", "ctx");
var cbScript = "function AnchorLevel5_OnClick(itemId, ctx){ new Menu().empty(ctx); " + cbRef + "; }";
cbScript += "function AnchorLevel5_OnClick_Callback(htmlText, ctx){ new Menu().render(htmlText, ctx); }";
cm.RegisterClientScriptBlock(this.GetType(), "CallServer", cbScript, true);
}
Моя проблема в том, что уровни за пределами второго уровня никогда не работают, потому что JavaScript, связанный с пользовательским элементом управления (метод «SettingCallbackReference»), не имеет html для размещения на странице.
Есть ли способ создать некоторые пользовательские элементы управления, созданные динамически, которые реализуют интерфейс ICallbackEventHandler, который добавляет новые пользовательские элементы управления на страницу? Или я что-то не так делаю, и это неправильный способ реализовать это поведение?
Спасибо !!!