首页 > 解决方案 > 回发后重新出现 ASP.NET 向导中删除的步骤

问题描述

我有一个 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>

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

这就是我要的。如果单击下一步按钮,则会发生回发,并且我应该能够在 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;
}

标签: asp.netwebformswizard

解决方案


我有同样的问题,尝试删除你想要的Page_LoadComplete循环步骤如下:

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

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

   }
}

推荐阅读