我在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); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。