2

以前の URL を (正しい順序で) クエリ文字列に格納する値 (できれば整数) に格納する賢い方法を探しています。

たとえば、4ページあります。ループでも、各ページから別のページに移動できます。

public enum Pages
    {
        [Url("/_layouts/A.aspx")]
        A = 1,
        [Url("/_layouts/B.aspx")]
        B = 2,
        [Url("/_layouts/C.aspx")]
        C = 3,
        [Url("/_layouts/D.aspx")]
        D = 4,
    }

クエリ文字列に保存したい値は、たとえば「Ref = 123456」です。この値から、前のページが何であるかを知る必要がありますが、これより前のページも正しい順序で知る必要があります!

最初に Flags 列挙型を使用することを考えましたが、ループに行き詰まりました... (A->B->C->D->A->C->A->B->A から移動できます->....)

これに対する良い解決策を知っている人はいますか?

-- 更新 --
この例では Pages を使用していますが、これはおそらく最良の例ではありません (より良い例を考え出すことはできません :-) ) が、これを参照できるように QueryString でこれが必要です。別のウェブサイトから

4

5 に答える 5

1

みんなの提案は素晴らしいですが、あなたの質問から私が得たのは、この値を保存して、将来それを読み返したいということです。

上記のように、他のすべての提案は一時的な解決策には適していますが、できるだけ少ない情報でパスを保存する場合にはあまり適していません。

そうは言っても、ソリューションを使用しても機能しますが、手動のページ セットに制限されます。

そう考えると、あなたは正しい道を歩んでいたと思います。

各ページには、他のページへのリンクがあります。これらのページが a、b、c、または d にリンクしていることがわかっているので、次のことができます。

<a href="~/a.aspx?Ref=<%= Request.QueryString["Ref"]; %><%= (string)(int)Pages.B; %>">Go to page A</a>

各ページには他のページへのリンクが含まれており、現在のページ ID を Ref QueryString に追加するだけです。

進むにつれて、パスが作成されます。

編集:読み返すために、少し変更する必要がある場合があります。?Ref=123456789 の代わりに

単一番号のページが二重番号のページと競合しないように、ページを分ける必要がある場合があります。

つまり ?Ref=1,2,3,4,5,6,7,8

<a href="~/a.aspx?Ref=<%= Request.QueryString["Ref"]; %>,<%= (string)(int)Pages.B; %>">Go to page A</a>

次に、次を使用できます。

string[] pages = Request.QueryString["Ref"].Split(',');
于 2012-05-30T12:35:17.347 に答える
1

たぶん私はこれを単純化しすぎているかもしれませんが、それらをリストに保存して、ユーザーが新しいページに移動するたびにリストに追加するだけではどうですか。次に、彼らがどこにいたかを把握したい場合は、リストの最後から逆に数えます.

var pages=new List<int>();
pages.Add(1);
pages.Add(2);

int previousPage= pages[pages.count-2];// -2 because -1 would be the last page, I think
MessageBox.Show(previousPage.ToString());

1 を表示する必要があります。

于 2012-05-30T12:20:33.923 に答える
1

私はあなたを助けるかもしれないナビゲーションフレームワークを書きました、http://navigation.codeplex.com/

最初のステップは、ページを構成することです。

<state key="A" page="~/A.aspx">
    <transition key="AB" to="B">
    <transition key="AC" to="C">
</state>
<state key="B" page="~/B.aspx">
    <transition key="BA" to="A">
    <transition key="BC" to="C">
</state>
<state key="C" page="~/C.aspx">
    <transition key="CA" to="A">
    <transition key="CB" to="B">
</state>

次に、コードで A.aspx から B.aspx に移動するには:

StateController.Navigate("AB");

B.aspx から C.aspx に移行するには:

StateController.Navigate("BC");

C から A に戻るには:

StateController.NavigateBack(2);

数値 2 が渡されるのは、2 ページ戻る必要があるためです。C から B に戻りたい場合は、代わりに 1 を渡します。

私がループを処理する方法のために、それがあなたが望むことを正確に行うとは思いません。たとえば、A->B->C->B から取得した場合、C に戻ることは許可されず、A に戻ることのみが許可されます。これは、繰り返されるページが表示されるとすぐに (このB の場合)、そのページの元の出現までの履歴を切り捨てます (これにより、リストが無限に長くなるのを防ぎます)。

興味がある場合、またはサポートが必要な場合は、お知らせください。

于 2012-05-30T12:24:59.010 に答える
1

これには2つの部分があります

  1. ナビゲーションに必要な URL のリストを取得する
  2. ナビゲーションの表示を提供します。

個人的には、これをクエリ文字列に格納するのはひどい考えだと思います。クエリ文字列に必要なのは、前のステップと次のステップのキーだけです。これは、URL のコレクション内の前のインデックスと次のインデックスのように単純なものにすることができます。

画面上で何らかの方法でユーザーに URL を表示すると、優れた UX が提供されます。この場合、表示テキストと URL の列挙が必要になります。最も単純な形で

var steps = new[] {
    new {Name = "", Url = ""},
    new {Name = "", Url = ""},
    new {Name = "", Url = ""},
    ...
};

これをセッションに保存し、あるリソースから次のリソースに移動するために使用できます。ある時点で、セッションのステップをクリア/リセットする必要があります。

@Pete がコメントで述べたように。「賢い」はあなたが探しているものではありません。あなたの言いたいことはシンプルで保守可能だと思います:)

于 2012-05-30T12:26:00.117 に答える
1

スタックを使用すると目的が解決します。ユーザーがあるページから別のページに移動するたびに、現在のページパスをスタックにプッシュし、ユーザーがキャンセルボタンをクリックすると、スタックから前のページを読み取り、そこにリダイレクトします。

PreviousPathその中に1つのプロパティPathを持つクラスを持っています

public class PreviousPath
{
    public string Path { get; set; }
}

そして、このクラスのスタックを持っています。

System.Collections.Generic.Stack<PageFrame> PageStack { get; set; }

このスタックをコンテキストで維持します。

ユーザーがあるページから別のページに移動するときにパスをプッシュします。

public void CurrentPath(string url)
    {
        // Push the current page on to the navigation stack
        if (PageStack == null)
        {
            PageStack = new Stack<PreviousPath>();
        }

        var pageFrame = new PageFrame { Path = url };
        PageStack.Push(pageFrame);
        }

    }

そして、1ページ戻りたい場合は、スタックからパスをポップするだけです:

public string GetPreviousPage()
    {
        string url;
        if (PageStack != null && PageStack.Count > 0)
        {
            url = PageStack.Pop().Path;
        }
        else
        {
            url = "/default.aspx";
        }
        return Redirect(url);
    }
于 2012-05-30T12:27:49.913 に答える