2011-03-03 67 views
1

我发现了很多解决方案,但没有一个在我的方案中不起作用。 我已经创建了一个测试项目来演示我的概念。updatepanel和javascript include文件

基本上,有承载用户控件的页面...

<body> 
<form id="form1" runat="server"> 
<asp:ScriptManager ID="ScriptManager1" runat="server"> 
</asp:ScriptManager> 
<div> 
    <uc1:WebUserControl1 ID="WebUserControl11" runat="server" /> 
    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /> 
    <br /> 
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> 
</div> 
</form> 

WebUserControl1具有下拉列表和另外两个webusercontrols(基于下拉列表元素的选择要被显示)的内部更新面板如下。隐藏文件WebUserControl1是

<%@ Register Src="WebUserControl2.ascx" TagName="WebUserControl2" TagPrefix="uc2" %> 
<%@ Register Src="WebUserControl3.ascx" TagName="WebUserControl3" TagPrefix="uc3" %> 
<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
<ContentTemplate> 
    <asp:DropDownList ID="DropDownList1" runat="server"     
      OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" 
     AutoPostBack="True"> 
    </asp:DropDownList> 
    <asp:Panel ID="pnlCreditCard" Visible="false" runat="server"> 
     <uc2:WebUserControl2 ID="WebUserControl21" runat="server" /> 
    </asp:Panel> 
    <asp:Panel ID="pnlGiftCard" Visible="false" runat="server"> 
     <uc3:WebUserControl3 ID="WebUserControl31" runat="server" /> 
    </asp:Panel> 
</ContentTemplate> 
</asp:UpdatePanel> 

代码.....

 public enum PaymentMethod 
    { 
     CreditCard = 0, 
     GiftCard 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
      BindPaymentMethods(Enum.GetValues(typeof(PaymentMethod))); 
    } 

    private void BindPaymentMethods(Array paymentMethods) 
    { 
     DropDownList1.DataSource = paymentMethods; 
     DropDownList1.DataBind(); 

     if (paymentMethods.Length > 0) 
     { 
      DropDownList1.SelectedIndex = 0; 
      UpdateCreditOrGiftCardPanelVisibility(); 
     } 
    } 

    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     UpdateCreditOrGiftCardPanelVisibility(); 
    } 

    private void UpdateCreditOrGiftCardPanelVisibility() 
    { 
     if(DropDownList1.SelectedValue == Enum.GetName(typeof(PaymentMethod),PaymentMethod.CreditCard)) 
     { 
      pnlGiftCard.Visible = false; 
      pnlCreditCard.Visible = true; 
     } 
     else if (DropDownList1.SelectedValue == Enum.GetName(typeof(PaymentMethod), PaymentMethod.GiftCard)) 
     { 
      pnlCreditCard.Visible = false; 
      pnlGiftCard.Visible = true; 
     } 
    } 

现在,问题就在这里开始...有一个外部JavaScript文件[JScript1.js](内嵌资源),这基本上是用来显示一个警告框。

<script language="javascript" type="text/javascript"> 

window.onload = function() { 
    alert('creditcard form'); 
} 

WebUserControl2.ascx.cs代码背后,是当我改变下拉列表的值没有显示

 protected void Page_Load(object sender, EventArgs e) 
    { 
     ScriptManager.RegisterClientScriptInclude(this.Page, this.Page.GetType().BaseType, "JScript1", Page.ClientScript.GetWebResourceUrl(this.Page.GetType().BaseType, "WebApplication1.JScript1.js")); 
    } 

警报窗口。即使脚本也被注册了三次(看看firebug) 由于原始JS文件太大,需要使用ScriptInclude而不是ScriptBlock。

可以通过电子邮件的测试程序....

由于提前

回答

0

了一下周围的工作后,我找到了解决办法。

我WebUserControl2.ascx

<asp:ScriptManagerProxy ID="ScriptManager1" runat="server" > 
<Scripts> 
    <asp:ScriptReference Assembly="WebApplication1" Name="WebApplication1.JScript1.js" /> 
</Scripts> 
</asp:ScriptManagerProxy> 

注册的ScriptManagerProxy然后在同一控制背后的代码,添加...

 protected override void OnPreRender(EventArgs e) 
    { 
     base.OnPreRender(e); 
     ScriptManager.RegisterStartupScript(this, GetType(), "test", "doSomething();", true); 
    } 

和JScript1.js文件看起来像下面。

function doSomething() { 
    alert('via dosomething control2 form'); 
} 

希望有所帮助。虽然我在实际场景中不得不乱抛垃圾,但这确实是我得到它的方式。

谢谢,