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的警报触发 有点罗嗦,为此道歉,我发现没有简单的方法来解释这一点. – -编辑 – – 我尝试过的一件事,与Scotts的建议一起工作. <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("ControlsTestControl1.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("ControlsTestControl2.ascx"); Panel1.Controls.Clear(); Panel1.Controls.Add(TestControl2); ScriptManager.RegisterStartupScript(TestControl2,TestControl2.GetType(),"TestControl2Script","alert("control 2");",true); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 我如何编写一个ActionFilter来确
- asp.net-mvc – @helper和Url.Action
- asp.net-mvc – MVC DateTime文本框格式化问题
- asp.net-mvc-2 – MVC2:如何确定actionlink是否
- asp.net-mvc – 使用Checkboxes绑定到具有强类型
- .net – 只有在配置中enableSessionState设置为t
- asp.net-core – db ASP.NET Core中的临时保存密
- 如何在ASP.NET中的多个Web应用程序中维护相同的会
- asp.net-mvc – 在system.web.optimization中自定
- asp.net-mvc – 测试使用DbContext的存储库的最佳