1

これは単純な論理問題のはずですが、何らかの理由で、これを実装するための半クリーンなアルゴリズムを考え出そうと何時間も苦労してきました。私は 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 分岐の悪夢です。

これを簡素化するための提案は大歓迎です。

4

1 に答える 1

2

ナビゲーション階層を表すツリー構造を作成すると、ツリーの事前順トラバーサルにより、目的の線形順序でページが表示されます。このようなトラバーサルを実行することができ、現在のページにヒットしたら、目的の次のページとなるロックされていないページが見つかるまでトラバーサルを続けることができます。

擬似コード:

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()関数に渡します。

于 2012-08-16T17:47:58.110 に答える