У меня есть пользовательский элемент управления, который открывает новое окно для выбора некоторых элементов.
Как только элемент выбран в этом окне, идентификатор элемента должен быть передан функции JavaScript обратного вызова в пользовательском элементе управления.
Чтобы иметь уникальное имя функции обратного вызова в пользовательском элементе управления (оно может иметь несколько экземпляров на одной странице), я добавил идентификатор пользовательского элемента управления в имя функции следующим образом (определено в файле ascx):
function OnItemSelection_<%=this.ID%>(selectedItemID)
{
OnItemSelection("<%=SomeControl.ClientID%>", selectedItemID)
}
Где OnItemSelection определяется во внешнем js-файле:
function OnItemSelection(controlID, selectedItemID)
{
$(controlID).do_something(selectedItemID);
}
Проблема в том, что теперь я не уверен, как новая страница может вызывать «правильную» функцию (экземпляра пользовательского элемента управления, откуда она была открыта).
Единственная идея, которую я имею в виду, это передача имени функции обратного вызова в строке запроса:
var CallbackFunction = function(selectedItemID)
{
window.opener.<%=Request.QueryString["CallbackFunctionName"]%>(selectedItemID);
}
или, может быть, просто ввод идентификатора пользовательского элемента управления:
var CallbackFunction = function(selectedItemID)
{
window.opener.OnItemSelection_<%=Request.QueryString["UserControlID"]%>(selectedItemID);
}
Мои вопросы:
1) Это плохая практика передачи имен функций javascript (или идентификаторов пользовательских элементов управления), как это (я подозреваю, что это так)?
2) Какой может быть лучший способ справиться с этим сценарием?
Edit:
Другой способ, который я сейчас рассматриваю, - объявить глобальную переменную в пользовательском элементе управления (зарегистрировать ее из кода, чтобы она появлялась только один раз). Затем при открытии нового окна можно назначить ему соответствующую функцию (OnItemSelection _ <% = this.ID%>) и вызвать ее из нового окна.
Кажется, намного чище, чем передача пользовательских данных управления через строку запроса.