回发后,ASP.NET向导中已删除的步骤会重新出现

时间:2018-09-28 19:12:55

标签: asp.net webforms wizard

我有一个包含多个步骤的ASP.NET向导,我需要根据某些标志跳过某些步骤。我当时想我可以使用Wizard.WizardSteps.Remove(WizardStepBase)方法摆脱不必要的步骤,因为它们无法禁用。

当我第一次导航到包含向导的页面时,我在标记中指定了五个步骤。

<asp:Wizard ID="Wizard1" runat="server" OnActiveStepChanged="Wizard1_ActiveStepChanged" OnFinishButtonClick="Wizard1_FinishButtonClick" OnNextButtonClick="Wizard1_NextButtonClick">
    <!-- Navigation and Header templates go here -->
    <WizardSteps>
        <asp:WizardStep ID="StepA" runat="server">
            <!-- Content goes here -->
        </asp:WizardStep>
        <asp:WizardStep ID="StepB" runat="server">
            <!-- Content goes here -->
        </asp:WizardStep>
        <asp:WizardStep ID="StepC" runat="server">
            <!-- Content goes here -->
        </asp:WizardStep>
        <asp:WizardStep ID="StepD" runat="server">
            <!-- Content goes here -->
        </asp:WizardStep>
        <asp:WizardStep ID="StepE" runat="server">
            <!-- Content goes here -->
        </asp:WizardStep>
    </WizardSteps>
</asp:Wizard>
  • 步骤A:索引= 0
  • 步骤B:索引= 1
  • 步骤C:索引= 2
  • 步骤D:索引= 3
  • 步骤E:索引= 4

我使用Wizard.WizardSteps.Remove(WizardStepBase)方法删除步骤C和D。如果再次检查索引,则会显示以下内容:

  • 步骤A:索引= 0
  • 步骤B:索引= 1
  • 步骤C:索引= -1(未找到;已将其删除)
  • 步骤D:索引= -1(未找到;已将其删除)
  • 步骤E:索引= 2

这就是我想要的。如果单击下一步按钮,则会发生回发,并且我应该能够在NextButtonClick事件处理程序中从步骤A导航到步骤B,从步骤B导航到步骤E,并且未显示步骤C和步骤D。

问题是,这些步骤会在回发之后重新出现,因此,即使启用了ViewState,我也将不得不在每次回发中都删除步骤C和D。我希望向导会记住其中的哪些步骤。是不是有特定原因导致这种情况?

这是源代码:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        // Omitted: Setting values of StepAEnabled, etc. based on business rules.
        // Just hard-code for this example
        var stepAEnabled = true;
        var stepBEnabled = true;
        var stepCEnabled = false;
        var stepDEnabled = false;
        var stepEEnabled = true;

        if (!stepAEnabled)
            Wizard1.WizardSteps.Remove(StepA);

        if (!stepBEnabled)
            Wizard1.WizardSteps.Remove(StepB);

        if (!stepCEnabled)
            Wizard1.WizardSteps.Remove(StepC);

        if (!stepDEnabled)
            Wizard1.WizardSteps.Remove(StepD);

        if (!stepEEnabled)
            Wizard1.WizardSteps.Remove(StepE);
    }

    // When !IsPostBack, totalSteps == 3
    // When IsPostback, totalSteps == 5
    var totalSteps = Wizard1.WizardSteps.Count;
}

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,请尝试在Page_LoadComplete周期中删除所需的步骤,如下所示:

protected void Page_LoadComplete(object sender, EventArgs e)
{
  foreach (WizardStepBase step in wizard.WizardSteps)
  {

    if (YOUR LOGIC)
    {
      wizard1.WizardSteps.Remove(step);
    }            

   }
}