2

選択に基づいてデータを取得するために自動ポストバックに設定されているマスター ページに ddl があります。リスト内の値は customerids であり、セッション変数として設定されており、誰かがいずれかを選択すると、コードは session["selectedCustomer"] を参照し、適切なフィールドに入力します。今私が遭遇した問題は、Chrome または IE で自動ポストバックが実行されると、フィールドにデータが入力され、選択された顧客がデフォルトに戻されることです。ポストバック後のFirefoxでは、フィールドにデータが入力され、ドロップダウンリストは選択した顧客にとどまります。

    protected void ddlSelectedCustomer_SelectedIndexChanged(object sender, EventArgs e)
    {
        CustomerSelected();

        Response.AppendHeader("Refresh", "0; URL=" + this.ResolveUrl("~/AcesSetup/storefront.aspx"));
        try
        {
            ViewState["SelectedAccordionIndex"] = ((AjaxControlToolkit.Accordion)FindControl("MyAccordion")).SelectedIndex;
        }
        catch (Exception ex)
        { }
    }

それは私のddlのselectedChangedイベントです

    private void CustomerSelected()
    {

        //clear the session variable
        Session.Remove("selectedCustomer");

        //user selected customer
        if (ddlSelectedCustomer.SelectedIndex != -1)
        {
            Session["selectedCustomer"] = ddlSelectedCustomer.SelectedValue;
        }

    }

    private void fillCustomers()
    {

        //save the value of the current selection to reselect later if still exists
        string origSelectedItem = ddlSelectedCustomer.SelectedValue;

        //check what role the user is in
        string usersRole = Roles.GetRolesForUser(Membership.GetUser().UserName)[0];

        MembershipUser user = Membership.GetUser();

        switch (usersRole)
        {
            case "SalesRep":
                ddlSelectedCustomer.DataSource = DAL.Util.getSalesRepCustomers((Guid)user.ProviderUserKey);
                ddlSelectedCustomer.DataBind();

                break;
            case "BasicUser":
            case "Customer":
                ddlSelectedCustomer.DataSource = DAL.Util.getCustomersListForUser((Guid)user.ProviderUserKey);
                ddlSelectedCustomer.DataBind();

                break;
            case "Admin":
            case "SuperAdmin":
                ddlSelectedCustomer.DataSource = DAL.Util.getAllCustomersList(); 
                ddlSelectedCustomer.DataBind();
                break;
            default:
                break;
        }

        //if user had a company selected, reselect it if it exists
        if (origSelectedItem != string.Empty)
            ddlSelectedCustomer.SelectedValue = origSelectedItem;
        else if (ddlSelectedCustomer.Items.Count == 1)
        {
            //if only one item in the list, select it
            ddlSelectedCustomer.Items[0].Selected = true;
        }

これがドロップダウンリストに入力されます。また、Firefox がポスト バックを行うと、ページ全体がリロードされないように見えます。Chrome または IE では、ページ全体が白く点滅してリロードされます。Firefox では、アコーディオン用に持っているビューステートが想定どおりに機能するためですが、Chrome や IE ではそうではありません。

何かお役に立てれば幸いです。解決できることがあれば、または提供できるコード スニペットがあれば、すべてを更新するために最善を尽くします。

ありがとうございました。

4

1 に答える 1

1
 protected void ContentPlaceHolder1_Load(object sender, EventArgs e)
        {
            if (Session["selectedCustomer"] != null)
            {
                ddlSelectedCustomer.SelectedValue = Session["selectedCustomer"].ToString();
            }
        }

 <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server" OnLoad="ContentPlaceHolder1_Load">
 </asp:ContentPlaceHolder>

セッションを失うことはありません。選択をクリアするだけです。保存されたセッションで選択した値を設定して、Loadイベントを処理してみてください。ContentPlaceHolder

于 2012-05-15T16:21:38.220 に答える