Asp.net 向导控件的下一步按钮行为似乎被另一个控件改变了?

Asp.net wizard control's Next button behavior seems to be getting altered by another control?

我的应用程序中有一个 asp.net 向导控件。我无法解释我所看到的行为,但这是它正在做的事情。

向导从用户那里收集数据,在向导第一步的底部,我有一个免责声明,声明用户同意条款和条件,并带有一个复选框,表示他们同意。我没有将所有术语都放在向导中,而是在另一个 aspx 页面上列出了所有这些内容。在向导中,我有一个声明,上面写着 "I -your name here- agree to the Terms and Conditions." 条款和条件是一个 asp LinkBut​​ton,它执行跨页 post 回到我的其他页面,并详细说明我的条款,它打开一个新的 window/tab.

当您单击 "Continue" 按钮前进到向导的第二步时,事情变得疯狂起来。如果用户没有点击 LinkBut​​ton 来查看条款,一切正常——数据表单被验证并且向导继续下一步。但是,如果他们单击“条款和条件”link 按钮,它将 post 返回到我的条款页面并在该页面上显示带有他们输入的名称的条款 - 正如它应该的那样。这是我无法解释的部分...当他们返回向导并单击“继续”按钮时,它会打开另一个“条款和条件”选项卡并且不会前进到下一个向导步骤。

这就像单击 LinkBut​​ton 控件以某种方式重新连接向导的“下一步”按钮应该执行的操作。但它只有在单击 LinkBut​​ton 时才会发生。

这是我的向导声明...

<asp:Wizard ID="Wizard1" runat="server" CellSpacing="5" Font-Names="Verdana" DisplaySideBar="False"
            ActiveStepIndex="0" FinishCompleteButtonText="Submit" StartNextButtonText="Continue" Width="100%" OnNextButtonClick="Wizard1_NextButtonClick" OnFinishButtonClick="Wizard1_FinishButtonClick" ValidateRequestMode="Enabled">
            <StartNavigationTemplate>
                <asp:Button ID="StartNextButton" CausesValidation="true" runat="server" BackColor="White" BorderColor="#091C49" BorderStyle="Solid" BorderWidth="1px" CommandName="MoveNext" Font-Names="Verdana" Text="Continue" UseSubmitBehavior="False" />
            </StartNavigationTemplate>
            <StepNavigationTemplate>
                <asp:Button ID="StepPreviousButton" runat="server" BackColor="White" BorderColor="#091C49" BorderStyle="Solid" BorderWidth="1px" CausesValidation="False" CommandName="MovePrevious" Font-Names="Verdana" Text="Previous" />
                <asp:Button ID="StepNextButton" runat="server" BackColor="White" BorderColor="#091C49" BorderStyle="Solid" BorderWidth="1px" CommandName="MoveNext" Font-Names="Verdana" Text="Next" />
            </StepNavigationTemplate>
            <StepStyle VerticalAlign="Top" />
            <SideBarStyle BackColor="#507CD1" Height="100%" HorizontalAlign="Left"
                VerticalAlign="Top" Width="140px" />
            <NavigationButtonStyle BackColor="White" BorderColor="#091c49" BorderStyle="Solid"
                BorderWidth="1px" Font-Names="Verdana" />

这是向导第一步底部​​的复选框和 link 按钮。

<asp:CheckBox ID="cbSignature" runat="server" Checked="false" OnClick="ShowHideCVText()" />
                                <asp:CustomValidator runat="server" ID="cvCheckBoxRequired" EnableClientScript="true" Font-Bold="true" OnServerValidate="CheckBoxRequired_ServerValidate" ClientValidationFunction="ValidateCheckBox" ErrorMessage="You must indicate that you have read and agree to the terms and conditions of this lease by checking the chekcbox below to continue." ForeColor="Red">*</asp:CustomValidator> 
                                I <asp:Label ID="lblSignatureName" runat="server" /> have read and fully understand the <asp:LinkButton ID="lbLeaseTerms2" runat="server" OnClientClick="window.document.forms[0].target='_blank';" CausesValidation="false" PostBackUrl="~/LeaseAgreement" Text="Terms &amp; Conditions" />  of the lease agreement between blah blah blah...

这可能与我用来将 LinkBut​​ton 打开到新的 window 中的 hack 有关吗?似乎不太可能,因为它在单独的控件上,但我不知道。

OnClientClick="window.document.forms[0].target='_blank';"

这是从第 1 步到第 2 步时代码隐藏中唯一发生的事情...只是用输入的文本值填充一些标签控件。

protected void Wizard1_NextButtonClick(object sender, System.Web.UI.WebControls.WizardNavigationEventArgs e)
{
    lblCustomersName.Text = txtFirstName.Text + " " + txtLastName.Text;
    lblCustomersPhone.Text = txtPhoneNumber.Text;
    lblPhoneType.Text = rblPhoneType.SelectedItem.Text;
    lblCustomerStreetAddress.Text = txtStreetAddress.Text + Environment.NewLine +
                                    txtCity.Text + ", " + ddlState.SelectedItem.Text + " " + txtZip.Text;
    lblCustomersEmail.Text = txtEmailAddress.Text;
    lblParkingLength.Text = ddlLengthNeeded.SelectedItem.Text;
    lblVehicleYear.Text = txtVehicleYear.Text;
    lblRegisteredOwner.Text = txtRegisteredOwner.Text;
    lblVehicleMake.Text = txtVehicleMake.Text;
    //lblVehicleLicensePlate.Text = txtLicensePlate.Text;
    lblLeaseDuration.Text = ddlLeaseDuration.SelectedItem.Text;
    lblSummarySignature.Text = txtFirstName.Text + " " + txtLastName.Text;
}

此时完全不明白为什么单击 link 按钮会改变向导的“继续”按钮的行为。

表单中的任何 asp 按钮都会提交表单,除非您使用 OnClientClick="return false;" ,这在这种情况下是不可取的,因为您使用的是 onclick 并且会禁用 onclick。

由于按钮提交了表单,因此它会提交给您已更改的表单目标(您自己想出来的,差不多)。

如果我是你,我会使用标准的 HTML link 而不是 link 按钮:

<a href="~/LeaseAgreement" target="_blank">Terms &amp; Conditions</a>

或者,如果您真的需要它作为一个 link 按钮,您可以使用 javascript setTimeout 函数将表单目标重置为 '',但我不确定 '' 无需先测试即可工作。

因此,在阅读了 Jack Arbiter 的上述评论后,这帮助我找出了目标问题。基本上我从 link 按钮的 OnClientClick 事件调用下面的函数,它将目标设置为新的 window 然后等待一秒钟并将其重置回自身。

function handlePostBack() {
        window.document.forms[0].target = '_blank';

        setTimeout(function () {
            window.document.forms[0].target = '_self';
        }, 1000);
    }

为了解决回发问题,我实际上是通过查看向导的设计器视图无意中发现的。如果您转到“设计”视图并使用“>”按钮展开向导控件,您会注意到那里有一个 "Edit Templates" 选项。我 select 编辑了它,然后不得不再次使用“>”按钮扩展那个 Designer 东西。一旦我这样做了,我就能够 select "Start Navigation Template" 因为那是我的 "Continue" 按钮所在的位置。当您单击“继续”按钮时,您将获得在属性 window 中公开的按钮的所有属性,包括 PostBackUrl。我注意到它没有设置,因为我相信它默认为 PostBack 到它自己。我明确地将它设置在那里以回发给它自己和哇啦......问题解决了。

这是它对标记的影响:

<StartNavigationTemplate>
                <asp:Button ID="StartNextButton" CausesValidation="true" runat="server" BackColor="White" BorderColor="#091C49" BorderStyle="Solid" BorderWidth="1px" CommandName="MoveNext" Font-Names="Verdana" Text="Continue" UseSubmitBehavior="False" PostBackUrl="~/LeaseOnline.aspx" />
            </StartNavigationTemplate>