updatepanel和javascript包含文件

时间:2011-03-03 01:31:46

标签: c# javascript asp.net ajax

我找到了许多我的问题的解决方案,但没有一个在我的方案中不起作用。 我创建了一个测试项目来演示我的概念。

基本上,有一个主持用户控件的页面......

<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在updatepanel中有一个下拉列表和另外两个webusercontrols(根据dropdownlist元素的选择显示),如下所示。

<%@ 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>

WebUserControl1的代码隐藏文件是.....

        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"));
    }

更改下拉列表值时,不会显示警报窗口。即使脚本已经注册了三次(看看萤火虫) 需要使用ScriptInclude而不是ScriptBlock,因为原始的JS文件太大了。

可以通过电子邮件发送测试应用....

先谢谢

1 个答案:

答案 0 :(得分:1)

稍微解决了一下后,我找到了解决方案。

我在WebUserControl2.ascx中注册了ScriptManagerProxy

<asp:ScriptManagerProxy ID="ScriptManager1" runat="server" >
<Scripts>
    <asp:ScriptReference Assembly="WebApplication1" Name="WebApplication1.JScript1.js" />
</Scripts>
</asp: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');
}

希望有所帮助。虽然在实际场景中我不得不乱扔垃圾,但这肯定是我开始工作的方式。

谢谢,