У меня есть мастер 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
Я удаляю шаги C и D, используя метод Wizard.WizardSteps.Remove (WizardStepBase),Если я проверю индексы снова, у меня будет следующее:
- Шаг A: индекс = 0
- Шаг B: индекс = 1
- Шаг C: индекс = -1 (не найдено; оно было удалено)
- Шаг D: индекс = -1 (не найдено; оно было удалено)
- Шаг E: индекс = 2
Это то, что я хочу.Если щелкнуть следующую кнопку, произойдет обратная передача, и я смогу перейти от шага A к шагу B, шагу B к шагу E в обработчике событий NextButtonClick, а шаг 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;
}