ASP.Net - AJAX UpdatePanel中的Javascript

Rya*_*ord 10 javascript asp.net ajax jscolor

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

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

以下是我将其缩小到的范围:

  • 如果我在一个文本框外面使用颜色选择器UpdatePanel,它在所有回发中都可以正常工作.

  • 如果我在一个文本框中使用颜色选择器UpdatePanel,它可以工作,直到我进行异步回发(单击ListView中的"编辑"按钮).一旦UpdatePanel做了回传,点击后的文本将不再显示颜色选择器.同样,当文本框是无论是在发生InsertItemTemplateEditItemTemplateListView中的.

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

KP.*_*KP. 15

在异步往返之后,将不会运行任何启动脚本,这可能是为什么它在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我实际上将上面的内容编入基页类,以便我正在使用的任何页面都可以调用this.RegisterClientStartupScript(...).要做到这一点,只需创建一个基页类并将其包含在那里(确保标记为protected not private,否则继承的页面类将无法访问它).

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