简单的算法使向导导航不那么线性

时间:2012-08-16 17:39:59

标签: c# algorithm logic

这应该是一个简单的逻辑问题,但出于某些原因,我一直在努力尝试用半干净的算法来实现它。我正在使用具有SQL Server背景的MVC3,但即使您不了解MVC,您仍然可以帮助我使用该算法。

我正在编写一个使用类似向导的界面的应用程序。目前,这些向导屏幕之间的导航非常线性(下一个按钮会立即转到页面,之前的按钮会立即转到页面之前)。由于范围变化(有趣,我知道)我现在被告知要使其不那么线性。

对于第一次贯穿,用户必须按线性顺序访问所有页面,如下所示:

Step 1
Step 2
Step 3
    SubStep 1
        Sub-SubStep 1
        Sub-SubStep 2
    SubStep 2
        Sub-SubStep 1
        Sub-SubStep 2
    ...
    SubStep *n*
        Sub-SubStep 1
        Sub-SubStep 2
Submission

其中 n 根据在步骤2中输入的内容而变化。

提交向导后,管理员会对其进行审核。如果他们发现缺少信息,他们可以解锁某些页面。当用户返回输入该信息时,他们应该只能查看那些特定页面。例如,导航可能是这样的:

Step 2
Step 3
    SubStep 1
        Sub-SubStep2
Submission

我当前的实现包含数据库中的一个表,用于跟踪未锁定的页面。单击“下一步”按钮时,它会调用一种方法来确定下一页是什么。由于在步骤3中发生的奇怪和可变的导航,这种方法是一个if-else分支的噩梦,很容易被打破。

非常感谢任何有关简化此事的建议。

1 个答案:

答案 0 :(得分:2)

如果您创建表示导航层次结构的树结构,则树的preorder traversal将以所需的线性顺序命中页面。您可以运行这样的遍历,当您点击当前页面时,您可以继续遍历,直到找到未锁定的页面,这将是所需的下一页。

伪代码:

class TreeNode:
    string name
    List<TreeNode> children

string findNextPage(TreeNode node, Set<string> unlockedPageNames, 
                    string currentPageName, ref bool currentPageFound):
    if currentPageFound && unlockedPageNames.Contains(node.name):
        return node.name
    if node.name == currentPageName:
        currentPageFound = true
    foreach child in children:
        result = findNextPage(child, unlockedPageNames, 
                              currentPageName, currentPageFound)
        if result != null:
            return result
    return null

string findNextPage(TreeNode node, Set<string> unlockedPageNames, 
                    string currentPageName):
    bool currentPageFound = false
    return findNextPage(node, unlockedPageNames, 
                        currentPageName, currentPageFound)

请注意,您需要一个根节点,其子节点必须是步骤1,步骤2和步骤3.将此根节点传递给最后一个findNextPage()函数。