Добавление ServiceReference программно во время асинхронной обратной передачи - PullRequest
3 голосов
/ 21 декабря 2009

Можно ли добавить новый ServiceReference экземпляр к ScriptManager на Page во время асинхронной обратной передачи, чтобы впоследствии я мог использовать указанный веб-сервис через клиентский скрипт?

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

РЕДАКТИРОВАНИЕ 2: Это код, который я вызываю из моего UserControl, который не выполняет то, что я ожидаю (добавление ServiceReference к ScriptManager во время асинхронной обратной передачи):

private void RegisterWebservice(Type webserviceType)
{
    var scm = ScriptManager.GetCurrent(Page);
    if (scm == null)
        throw new InvalidOperationException("ScriptManager needed on the Page!");

    scm.Services.Add(new ServiceReference("~/" + webserviceType.Name + ".asmx"));
}

Моя цель - чтобы мой UserControl был как можно более незаметным для окружающего приложения; в противном случае мне пришлось бы статически определить ServiceReference в ScriptManagerProxy на содержащем Page, что не то, что я хочу.

EDIT:

Должно быть, я устал от написания этого поста ... потому что хотел написать ServiceReference, а не ScriptReference. Обновленный текст выше соответственно.

Теперь у меня есть:

<asp:ScriptManagerProxy runat="server" ID="scmProxy">
    <Services>
        <asp:ServiceReference Path="~/UsefulnessWebService.asmx" />
    </Services>
</asp:ScriptManagerProxy>

но я хочу зарегистрировать веб-сервис в CodeBehind.

Ответы [ 2 ]

2 голосов
/ 22 декабря 2009

Попробуйте что-то вроде этого ...

if (ScriptManager.GetCurrent(this).IsInAsyncPostBack)
{
    ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "script1", "~/js/myjs.js");
}
1 голос
/ 24 декабря 2009

Изменить:

После проверки вашей проблемы, вот причина, почему она не работает: Когда вы добавляете ServiceReference в ScriptManager> раздел Services вручную на странице. Добавлена ​​1 директива включения клиентского скрипта.

например:

<script src="TestService.asmx/jsdebug" type="text/javascript"></script>

или

<script src="TestService.asmx/js" type="text/javascript"></script>

, которые предоставляют вам доступ к вашему Frontend.Web.YourScriptMethods ,

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

Но я нашел обходной путь для этого; (не знаю, как это правильно сделать)

    if (ScriptManager.GetCurrent(this).IsInAsyncPostBack)
    {
        ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "testservice", "TestService.asmx/js");
    }

Вы можете заменить путь «TestService.asmx» в соответствии с вашим проектом / веб-службой.

Таким образом, вы можете достичь того, что вы хотите.

Надеюсь, это поможет,

Крунал Мевада


Старые ответы:

Использовать следующее:

    if (ScriptManager.GetCurrent(this).IsInAsyncPostBack)
    {
        ScriptManager.GetCurrent(this).Services.Add(new ServiceReference("~/Service.asmx"));
    }
...