在异步回发期间以编程方式添加ServiceReference

时间:2009-12-21 16:23:05

标签: asp.net user-controls scriptmanager asynchronous-postback

是否可以在异步回发期间向ServiceReference上的ScriptManager添加新的 Page 实例,以便随后我可以使用引用的网页通过客户端脚本服务?

我正在尝试在位于UserControl内的Repeater内执行此操作,这就是为什么在Page_Load期间以编程方式添加ScriptReference在此处不起作用的原因。

编辑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的{​​{1}}中静态定义 ScriptManagerProxy ,这不是我想要的。

修改

我写这篇文章时一定很累...因为我打算写 Page 而不是ServiceReference。相应地更新了上面的文字。

现在我有:

ScriptReference

但我想在CodeBehind中注册web服务。

2 个答案:

答案 0 :(得分:2)

尝试这样的事情......

if (ScriptManager.GetCurrent(this).IsInAsyncPostBack)
{
    ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "script1", "~/js/myjs.js");
}

答案 1 :(得分:1)

修改

检查问题后,以下是它无法正常工作的原因: 将ServiceReference添加到ScriptManager>服务部分在页面中手动它添加了1个客户端脚本include指令。

e.g:

<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”路径。

这样你就可以达到你想要的效果。

希望这有帮助,

Krunal Mevada


Old Ans:

使用以下内容:

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