2

ボタンをクリックしてUpdatePanel内のプレースホルダーにコントロールを追加すると、何回かすばやくクリックして次のようなエラーメッセージが表示される場合を除いて、すべて問題ありません。

'Sys.WebForms.PageRequestManagerServerErrorException: Sys.WebForms.PageRequestManagerServerErrorException: Multiple controls with the same ID 'VehicleRegistrationEnhancedTextBox3_Label' were found. FindControl requires that controls have unique IDs.' when calling method: [nsIDOMEventListener::handleEvent]
[Break On This Error]   

整数を非表示フィールドに保存して、一意のIDを作成します。非常に速くクリックすると、メソッドが数回実行されますが、カウント値はまだ更新されていません。C#lockキーワードを使用してみましたが、何も起こりませんでした。

コードは以下のとおりです。

protected void AddVehicleButton_Click(object sender, EventArgs e)
        {
            lock (this)
            {
                int count = Convert.ToInt32(VehicleRegistrationCountHiddenField.Value);

                var TBId = "VehicleRegistrationEnhancedTextBox" + count;
                IList<Panel> oldPanels = (IList<Panel>)Session["VehiclePanels"] ?? new List<Panel>();

                //Seperator
                Literal hr = new Literal { Text = "<hr/>" };

                //RemoveSpan
                Literal span = new Literal() { Text = "<span class=\"RemoveVehicleRegistration\">X</span>" };

                //Crop
                Control uc = LoadControl("~/Controls/ImageUploadAndCrop/ImageUploadAndCrop.ascx");
                uc.ID = "VehicleRegistrationImageUploadAndCrop" + count;

                //Vehicle Registration
                Label vehicleRegistration = new Label
                {
                    ID = TBId + "_Label",
                    AssociatedControlID = TBId,
                    Text = "Vehicle Registration:"
                };
                EnhancedTextBox vehicleTypeTextBox = new EnhancedTextBox
                {
                    ID = TBId,
                    Required = true,
                    RequiredErrorText = "Vehicle Registration is a required field."
                };

                //Add new controls to the form
                Panel newPanel = new Panel();

                newPanel.Controls.Add(hr);
                newPanel.Controls.Add(span);
                newPanel.Controls.Add(vehicleRegistration);
                newPanel.Controls.Add(uc);
                newPanel.Controls.Add(vehicleTypeTextBox);

                AddVehiclePlaceholder.Controls.Add(newPanel);

                //Increment the ID count
                count++;
                VehicleRegistrationCountHiddenField.Value = count.ToString();

                //Save the panel to the Session.
                oldPanels.Add(newPanel);
                Session["VehiclePanels"] = oldPanels;

                //Go back to the same wizard step.
                ShowStep2HiddenField.Value = "true";
                ShowStep3HiddenField.Value = "false";
            }
        }
4

2 に答える 2

3

問題は、同じリクエストで複数のポストバックをキックしていることです。最後の応答は、更新パネルのdivを更新しているため、問題が発生しています。考えられる解決策の1つは、クリック時にボタンを無効にするJavaScriptを含めることです。

<asp:Button ID="myUpdatePanelPostBackButton" runat="server" OnClientClick="this.disabled=true; return true;" Text="Submit" />

ボタンがUpdatePanel内にあるとすると、更新パネルが戻ると、ボタンが再度有効になります。

于 2012-07-11T15:56:26.027 に答える
0

ボタンを無効にしても、PostBackは発生しません。したがって、OnClientClickでボタンのみを無効にすると、PostBackは発生しません。

試してみてくださいUseSubmitBehavior="false"、それは「とにかくポストバックを引き起こす」という意味です。

<asp:Button runat="server" ID="BtnSubmit" 
OnClientClick="this.disabled = true; this.value = 'Submitting...';" 
UseSubmitBehavior="false" 
OnClick="BtnSubmit_Click" 
Text="Submit Me!" />

このブログを参照してください、それはあなたのために役立ちます。 http://encosia.com/disable-a-button-control-during-postback/

于 2012-12-19T02:33:05.690 に答える