updatepanel и javascript include file - PullRequest
1 голос
/ 03 марта 2011

Я нашел много решений для моей проблемы, но ни одно из них не работает в моем сценарии.Я создал тестовый проект для демонстрации своей концепции.

По сути, есть страница, на которой размещен пользовательский элемент управления ...

<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 (которые будут отображаться на основе выбора элемента раскрывающегося списка) внутри панели обновления, как показано ниже.

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

Окно предупреждений не отображается при изменении значения раскрывающегося списка.Даже сценарий регистрируется три раза (смотрите в firebug). Необходимо использовать ScriptInclude вместо ScriptBlock, поскольку исходный файл JS слишком велик.

Можно отправить тестовое приложение по электронной почте ....

Заранее спасибо

1 Ответ

1 голос
/ 04 марта 2011

Немного поработав, я нашел решение.

Я зарегистрировал ScriptManagerProxy в WebUserControl2.ascx

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

Надеюсь, это поможет.Хотя в моем практическом сценарии мне приходилось больше мусорить, но именно так я и работал.

Спасибо,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...