Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在AJAX回调(回发)期间生成JavaScript,然后在浏览器上执行它?_C#_Javascript_Ajax_Asp.net 3.5 - Fatal编程技术网

C# 如何在AJAX回调(回发)期间生成JavaScript,然后在浏览器上执行它?

C# 如何在AJAX回调(回发)期间生成JavaScript,然后在浏览器上执行它?,c#,javascript,ajax,asp.net-3.5,C#,Javascript,Ajax,Asp.net 3.5,总之: 我有一个ASP.NET网页,它会导致AJAX回发到服务器。当这个事件处理程序运行时(在代码隐藏中),它将生成一些JavaScript,然后我希望在客户端中运行这些JavaScript。不知道如何实现这一点 详细信息: 我有一个ASP.NET网页,页面上显示了多个项目 作为一个“很好拥有”,我想在每个项目旁边显示一个绿色圆圈或一个红色十字架(根据每个项目的不同而有所不同)。由于用户看到这些图标并不重要,而且计算每个项目应该显示哪个图标也需要几秒钟,因此我希望在页面加载后执行此操作,因此在A

总之

我有一个ASP.NET网页,它会导致AJAX回发到服务器。当这个事件处理程序运行时(在代码隐藏中),它将生成一些JavaScript,然后我希望在客户端中运行这些JavaScript。不知道如何实现这一点

详细信息: 我有一个ASP.NET网页,页面上显示了多个项目

作为一个“很好拥有”,我想在每个项目旁边显示一个绿色圆圈或一个红色十字架(根据每个项目的不同而有所不同)。由于用户看到这些图标并不重要,而且计算每个项目应该显示哪个图标也需要几秒钟,因此我希望在页面加载后执行此操作,因此在AJAX回调中

因此,我的想法是这样的。创建页面时,我会在每个对象旁边创建两个图标,并使用“隐藏”样式创建它们。我还会记下每个人的客户ID

然后,当回调发生时,我从数据库中获取必要的数据,然后创建一个JavaScript函数,将要显示的每个图标的显示从“隐藏”更改为“可见”

我想我可以使用ScriptManager对象实现这一点

下面是我的服务器端代码(C#)的一个非常简单的版本

显然,在这里,我只是想在回发发生后得到一个触发警报…在现实生活中,我会使用JavaScript函数来更改我想要显示的所有图标的显示

当我运行这个程序时,服务器端代码会运行,但服务器中不会发生任何事情

我也尝试过:

ScriptManager.RegisterClientScriptBlock()
Page.RegisterStartupScript()
Page.RegisterClientScriptBlock()
Page.ClientScript.RegisterStartupScript()
Page.ClientScript.RegisterClientScriptBlock()
但它们都不起作用

FireFox显示以下JavaScript错误:

错误:未捕获异常:[异常…”节点无法插入层次结构“代码:”3“nsresult:“0x80530003(NS\u错误\u DOM\u层次结构\u请求\u错误)”位置中的指定点:"http://localhost/MyWebSiteName/Telerik.Web.UI.WebResource.axd?_TSM_HiddenField_=ctl00_RadScriptManager1_TSM&compress=1&_TSM_CombinedScripts_=%3b%3bSystem.Web.Extensions%2c+版本%3d3.5.0.0%2c+区域性%3dneutral%2c+公钥令牌%3d31bf3856ad364e35%3aen US%3a3de828f0-5e0d-4c7d-a36b-56a9773c0def%3EA597D4B%3ab25378d2%3bTelerik.Web.UI%2c+版本%3d2009.3.1314.20%2c+文化%3dneutral%2c+公钥代币%3d121fae78165ba3d4%3AEC%3aec1048f9-7413-49ac-913a-b3b534cde186%3a16e4e7cd%3aed16cbdc%3AA744F8EA2%3af7645509%3AA24EE1BBA%3a19620875%3a39040b5c%3af85f9819行:1075“]

有人知道我想做的事是否被允许吗

如果没有,我的选择是什么


谢谢

因为您的脚本没有封闭的
标记,所以您需要使用:

好的

其想法是页面将被加载,数据将被发送(AJAX)到服务器。然后服务器将根据这些数据生成一些JavaScript并将其发送回页面。然后JavaScript将以特定的方式运行更新页面

不能让它工作

我通过以下方式解决了这个问题:


加载页面时,发送数据(AJAX)到服务器。这将处理数据并序列化结果,更新一个隐藏的文本元素,该元素返回到浏览器。同时,我在页面上有一个JavaScript计时器,该计时器运行一个JavaScript函数,该函数在页面首次加载时生成。该函数查看隐藏的文本元素。如果该元素有文本(回发的结果)然后关闭计时器,反序列化数据,然后确定如何更新页面。

您说过您最初的目标是:

其想法是页面将被加载,数据将被发送(AJAX)到服务器。然后服务器将根据这些数据生成一些JavaScript并将其发送回页面。然后JavaScript将以特定的方式运行更新页面

这里有一种方法可以做到这一点:

鉴于:

<asp:ScriptManager runat="server" ID="scriptManager">
</asp:ScriptManager>
<script type="text/javascript">

    function endRequestHandler(sender, args) {
        var dataItems = args.get_dataItems();
        for(var key in dataItems){
            if(/^javascript:/.test(dataItems[key])){
                eval(dataItems[key].substring("javascript:".length));
            }
        }
    }
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);

</script>

<asp:UpdatePanel runat="server" ID="pnl">
    <ContentTemplate>
        <asp:Button runat="server" ID="btnClick" Text="Click me!" OnClick="btnClick_Click" />
    </ContentTemplate>
</asp:UpdatePanel>
在回发过程中,页面请求管理器会收到一个数据项,该数据项是您代码背后的数据项。该数据项恰好是一个javascript命令。回发后,客户端脚本管理器的endRequest处理程序会检查数据项。通常情况下,您希望看到这些数据项是用于谁的,通过项(它是作为发送数据的目标的控件的客户端ID)。在您的情况下,您可以使用要启动的javascript加载它,告诉自己这是一个javascript,因为它是预先设置的,然后动态评估脚本

因此,在本例中,单击“Click Me!”按钮将生成一个Hello World提示符,其脚本实际上是由回发过程中的代码创建的

在你感到舒适之前,你必须非常谨慎地使用这种方法-我会避免提及“这个”

快乐编码


B

你应该在AXAX Tag道歉中添加你的问题-是的,我试过用“真”这个词"参数来生成脚本标记,但运气不佳……也会产生我上面提到的相同层次结构错误。似乎与telerik自己的脚本管理器存在冲突。您是否尝试过使用其自定义RadScriptManager.RegisterStartupScript方法?Brian-非常好的帖子,谢谢。一个问题-有多少个结束请求事件handl一个页面上可以有ers吗?这是一个很大的web应用程序,包含大量的telerik AJAX组件——有些在母版页上——并且这个事件可能已经被处理了……我无法覆盖现有的事件处理程序。回答了我自己的问题……看起来你可以根据需要创建任意多个。我创建了两个,它们都按照定义的顺序启动。@Dr格里夫-你说得对-你想要多少就有多少。我肯定性能有实际的限制,但我从来没有做到:)
ScriptManager.RegisterStartupScript(this, this.GetType(), "uniqueKey", jscript, true);
<asp:ScriptManager runat="server" ID="scriptManager">
</asp:ScriptManager>
<script type="text/javascript">

    function endRequestHandler(sender, args) {
        var dataItems = args.get_dataItems();
        for(var key in dataItems){
            if(/^javascript:/.test(dataItems[key])){
                eval(dataItems[key].substring("javascript:".length));
            }
        }
    }
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);

</script>

<asp:UpdatePanel runat="server" ID="pnl">
    <ContentTemplate>
        <asp:Button runat="server" ID="btnClick" Text="Click me!" OnClick="btnClick_Click" />
    </ContentTemplate>
</asp:UpdatePanel>
protected void btnClick_Click(object sender, EventArgs e)
{
    ScriptManager.GetCurrent(Page).RegisterDataItem(this, "javascript:alert('hello world!');");
}