Добавление ServiceReference программно во время асинхронной обратной передачи
Можно ли добавить новый 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
что не то, что я хочу.
РЕДАКТИРОВАТЬ:
Должно быть, я устал, когда писал этот пост... потому что я хотел написать ServiceReference
не ScriptReference
, Обновленный текст выше соответственно.
Теперь у меня есть:
<asp:ScriptManagerProxy runat="server" ID="scmProxy">
<Services>
<asp:ServiceReference Path="~/UsefulnessWebService.asmx" />
</Services>
</asp:ScriptManagerProxy>
но я хочу зарегистрировать веб-сервис в CodeBehind.
2 ответа
Редактировать:
После проверки вашей проблемы, вот причина, почему она не работает: Когда вы добавляете 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"));
}
Попробуйте что-то вроде этого...
if (ScriptManager.GetCurrent(this).IsInAsyncPostBack)
{
ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "script1", "~/js/myjs.js");
}