我有一个包含多个步骤的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;
}
答案 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);
}
}
}