asp.net – 在.NET中发生部分回发时,用户控件中的Javascript不会触发

我试图了解一些使用updatepanels的部分回发,虽然很多事情让我感到困惑,但这让我感到困惑.

我在UpdatePanel中使用选项卡,因为这是一个数据输入应用程序,我将内容放入用户控件,因此每个选项卡都有自己的用户控件.另外,我正在为每个用户控件添加自定义javascript,以处理该控件中的东西的特定客户端事物.

在这样做虽然我已经注意到用户控件中的javascript不会触发部分页面回发.

为了模拟这个,我在VS2010中创建了一个非常简单的应用程序(在母版页上使用带有ScriptManager控件的母版页).

页面内容面板具有以下内容

<asp:UpdatePanel runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
<ContentTemplate>
   <asp:Button runat="server" ID="Button1" Text="Partial postback" />
   <br />
   <asp:Panel runat="server" ID="panel"></asp:Panel>
</ContentTemplate>
</asp:UpdatePanel>

然后我创建了一个用户控件,只需添加一些纯文本和一个javascript警报

<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="UC1.ascx.vb" Inherits="TestWebApp_VB.UC1" %>
This is user control 1
<script> alert('control 1'); </script>

然后在Content页面页面加载事件中,我将控件加载到面板中.

Panel.Controls.Add(LoadControl("UC1.ascx"))

此外,在按钮的单击处理程序中,我还加载控件(或切换时的不同控件,如下所述)

Button_Click
 Panel.Controls.Clear()
 Panel.Controls.Add(LoadControl("SomeControl.ascx"))

因此,当首次加载页面时,警报会触发,但是当您单击按钮并且页面被部分回发时,警报将永远不会触发.

我向前迈出了一步,创建了第二个用户控件,并按下切换按钮加载控件,并在UpdatePanel外添加一个普通按钮.每次我完成回发时,加载的用户控件中的javascript都会触发,但它永远不会触发部分回发.

然后我向前迈了一步,将控件中的javascript移动到一个函数中,这样我就可以从PageRequestManager或者document.ready中调用函数.

所以现在我的两个控件包含这个脚本(警报包含每个控件的不同消息)

<script type="text/javascript">
  function userLoad() {
    alert("Identify control");
  }
</script>

因此我将其添加到我的内容面板的末尾

<script type="text/javascript">
   var prm = Sys.WebForms.PageRequestManager.getInstance().add_endRequest(userLoad);
</script>

那么现在javascript会在每个部分回发上触发,但它会触发最后由完整回发加载的控件的javascript.

例:

>页面最终加载UserControl1 – UserControl1的警报触发
(此处未显示 – 在jquery中调用userLoad函数
的document.ready)
>用户单击按钮 – 应该加载UserControl2
> UserControl2已加载到屏幕上,但是UserControl1的警报
火灾

有点罗嗦,为此道歉,我发现没有简单的方法来解释这一点.

– -编辑 – –

我尝试过的一件事,与Scotts的建议一起工作.
将每个控件的javascript保存在一个单独的文件中,并将其全部放入一个名为函数UC1Load(){}的函数中(如果我感觉活泼,可能会在它周围粘贴一个命名空间),添加对脚本文件的引用内容页面通过

<script src='UC1.js'>

然后注册启动脚本来调用函数

ScriptManager.RegisterStartupScript(ctrl,ctrl.GetType(),"UserJS","UC1Load()",True)

最大的问题是我现在不得不下载一堆永远不会被使用的脚本,这就是为什么我首先将脚本放在用户控件中.

解决方法

好的,在创建了我自己的测试网站并进行修补之后,这就是我的工作:

TestControl1

<%@ Control Language="C#" 
            AutoEventWireup="true" 
            CodeFile="TestControl1.ascx.cs" 
            Inherits="Controls_TestControl1" %>

This is Test Control 1

TestControl2

<%@ Control Language="C#" 
            AutoEventWireup="true" 
            CodeFile="TestControl2.ascx.cs" 
            Inherits="Controls_TestControl2" %>

This is Test Control 2

10049777.aspx

<%@ Page Language="C#" 
         MasterPageFile="~/Site.master" 
         AutoEventWireup="true" 
         CodeFile="10049777.aspx.cs" 
         Inherits="_10049777" %>

<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="Server" />
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="Server">
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" 
        UpdateMode="Conditional" 
        ChildrenAsTriggers="true">
        <ContentTemplate>
            <asp:Button ID="Button1" runat="server"
                Text="Partial postback" 
                OnClick="Button1_Click" />
            <br /><br />
            <asp:Panel runat="server" ID="Panel1" />
        </ContentTemplate>
    </asp:UpdatePanel>
</asp:Content>

10049777.aspx.cs

protected void Page_Load(object sender,EventArgs e)
{
    if (!IsPostBack)
    {
        var TestControl1 = LoadControl("Controls\\TestControl1.ascx");

        Panel1.Controls.Add(TestControl1);
        ScriptManager.RegisterStartupScript(TestControl1,TestControl1.GetType(),"TestControl1Script","alert(\"control 1\");",true);
    }
}

protected void Button1_Click(object sender,EventArgs e)
{
    var TestControl2 = LoadControl("Controls\\TestControl2.ascx");

    Panel1.Controls.Clear();
    Panel1.Controls.Add(TestControl2);

    ScriptManager.RegisterStartupScript(TestControl2,TestControl2.GetType(),"TestControl2Script","alert(\"control 2\");",true);
}

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....