Вызов метода на главной странице из WebMethod - PullRequest
2 голосов
/ 04 августа 2010

Или любой жизнеспособный обходной путь.

Итак, представьте себе главную страницу, которая реализует IFooMaster с методом ShowFancyMessagePopupTheBusinessCantLiveWithout(string message);

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

Мне сообщили, что я не могу просто использовать alert('message'); в javascript, потому что они хотят, чтобы эти сообщения выглядели единообразно.

Затем я попытался сделать ajax-вызов через PageMethods (как и все, что используется в этой кодовой базе), чтобы показать сообщение. Моя проблема заключается в том, что этот метод статичен.

[WebMethod]
public static void ShowSuperImportantMessage()
{
     if(!checkboxICareAbout.Checked)
         ((IFooMaster)Master).ShowFancyMessagePopupTheBusinessCantLiveWithout("If you uncheck that thing, you can't recheck it.");
}

Поскольку ShowSuperImportantMessage() - это static, я не могу получить доступ к Master изнутри.

Метод на главной странице выглядит примерно так:

public void ShowFancyMessagePopupTheBusinessCantLiveWithout(string message)
{
    lblGenericMessage.Text = message;
    btnGenericMessageOK.Focus();
    upGenericMessage.Update();
    mpeGenericMessage.Show();
}

mpeGenericMessage является ajaxtoolkit: ModalPopupExtender.

upGenericMessage - панель обновления.

Остальные 2 очевидны.

Есть идеи? Могу ли я сделать jQuery кунг-фу, чтобы показать это? Я пытался, но решение жаловалось, что элементы управления, на которые я пытался ссылаться посредством ClientID, не были разрешены, поскольку они были на главной странице.

быстрое редактирование : Прежде чем кто-нибудь скажет мне, что архитектура является проблемой, или я не должен был помещать такую ​​вещь на главной странице, или ж / е ...

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

Ответы [ 3 ]

1 голос
/ 04 августа 2010

Попробуйте что-то вроде этого (не проверено):

((IFooMaster) ((Page)HttpContext.Current.Handler).Master)

Похоже, это не работает - Master не подключается при вызове PageMethod (имеет смысл).

Итак, вместо этого создайте пустую страницу, используя ту же главную страницу.Пусть эта страница принимает либо POST, либо GET с любыми параметрами, которые необходимо передать методу главной страницы.Пусть Page_Load извлечет параметры и вызовет метод.Затем следует использовать Response.Write, чтобы вернуть результат (и не забудьте изменить тип содержимого).Пусть ваш клиентский код позвонит на страницу и получит результат.

0 голосов
/ 17 августа 2010

Извините, что так долго отвечал / отвечал.

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

Как я уже сказал, я не горжусь этим грязным, грязным исправлением. Тем не менее, утешением является то, что, поскольку он находится на главной странице, над ним нет никакого контейнера для именования. Поэтому вероятность изменения идентификатора клиента гораздо меньше.

0 голосов
/ 04 августа 2010

Вы пробовали что-то вроде window.top перед ClientID?

За комментарии Вам не нужно жестко кодировать ClientID.Так как ваш js находится на странице, попробуйте что-то вроде следующего: ....

window.top.document.getElementById( "<%= yourelement.ClientID %>" ).Whatever();
...