小编典典

ASP.Net-AJAX UpdatePanel中的Javascript

ajax

我从UpdatePanel内部的外部javascript文件运行javascript时遇到问题。我试图让一个颜色选择器在ListView内部工作。ListView在UpdatePanel内部。

我正在使用这个颜色选择器

这是我将其范围缩小到的内容:

  • 如果我在之外的文本框上使用颜色选择器UpdatePanel,则在所有回发中它都可以正常工作。

  • 如果我在内的文本框上使用颜色选择器UpdatePanel,它将起作用,直到执行异步回发(单击ListView中的“编辑”按钮)为止。一旦UpdatePanel做了回传,点击后的文本将不再显示颜色选择器。当文本框位于ListView 的InsertItemTemplateEditItemTemplate中时,也会发生相同的情况。

如果您想复制它,只需下载颜色选择器(它是免费的),然后将其添加到网页…

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>

<div>
    <asp:UpdatePanel ID="panel1" runat="server">
        <ContentTemplate>
            <asp:TextBox runat="server" ID="textbox" CssClass="color" />
            <asp:Button ID="Button1" runat="server" Text="Button" />
        </ContentTemplate>
    </asp:UpdatePanel>
</div>

页面加载后,颜色选择器可以正常工作。当您单击按钮(进行回发)时,颜色选择器将不再起作用。

有任何想法吗?


阅读 211

收藏
2020-07-26

共1个答案

小编典典

异步往返之后,将不会运行任何启动脚本,这可能是为什么在AJAX回调后无法启动的原因。颜色选择器可能具有需要在页面加载时执行的功能。

我已经遇到了很多次,以至于我写了一个小方法在后台代码中注册脚本,该方法可以处理异步和非异步往返。基本概要如下:

private void RegisterClientStartupScript(string scriptKey, string scriptText)
{
    ScriptManager sManager = ScriptManager.GetCurrent(this.Page);

    if (sManager != null && sManager.IsInAsyncPostBack)
    {
        //if a MS AJAX request, use the Scriptmanager class
        ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), scriptKey, scriptText, true);
    }
    else
    {
        //if a standard postback, use the standard ClientScript method
        scriptText = string.Concat("Sys.Application.add_load(function(){", scriptText, "});");
        this.Page.ClientScript.RegisterStartupScript(this.Page.GetType(), scriptKey, scriptText, true);
    }
}

实际上,我将以上内容烘焙到了基页类中,以便我正在使用的任何页面都可以调用this.RegisterClientStartupScript(...)。为此,只需创建一个基础页面类并将其包含在其中(确保将受保护的标记为非私有,否则您继承的页面类将无法访问它)。

使用以上代码,无论页面正在执行回发还是回调,我都可以放心地注册客户端脚本。意识到您正在使用外部脚本文件,您可能可以修改上述方法来注册外部脚本,而不是内联。有关更多详细信息,请查阅ScriptManager类,因为有几种脚本注册方法…

2020-07-26