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'。根据这个值,我应该知道前一页是什么,还知道这之前的页面是什么,并且顺序正确!

首先我考虑使用标志枚举,但后来我陷入了循环......你可以从 (A->B->C->D->A->C->A->B->A ->....)

任何人都知道一个好的解决方案?

-- 更新 --
在这个例子中,我使用了 Pages,这可能不是最好的例子(想不出更好的东西 :-)),但我在 QueryString 中确实需要这个,所以我可以参考这个从另一个网站

4

5 回答 5

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

我看到这两个部分

  1. 获取导航所需的 url 列表
  2. 提供导航显示。

我个人认为将其存储在查询字符串中是一个糟糕的主意。查询字符串只需要前一个和下一个步骤键,它可以像 url 集合中的上一个和下一个索引一样简单。

在屏幕上以某种方式向用户显示 url 将提供一个很好的用户体验。在这种情况下,您需要枚举显示文本和 url。以最简单的形式

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

然后可以将其存储在会话中并用于从一个资源导航到下一个资源。在某些时候,您需要清除/重置会话中的步骤。

正如@Pete 在评论中提到的那样。“聪明”不是你想要的。我认为您的意思是简单且可维护的:)

于 2012-05-30T12:26:00.117 回答
1

使用堆栈解决了我的感觉,每当用户从一个页面导航到另一个页面时,只需将当前页面路径推送到堆栈上,当用户单击取消按钮时,从堆栈中读取上一页并将他重定向到那里。

有一个类PreviousPath,其中有一个属性 Path

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

并且有一个 Stack 的这个类。

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);
        }

    }

当您想返回一页时,只需从堆栈中弹出路径:

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 回答
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

每个人的建议都很棒,但是我从您的问题中得到的是,您可能希望存储此值并在将来读回它。

如上所述,其他人的建议对于临时解决方案非常有用,但在使用尽可能少的信息存储路径时就不那么好了。

也就是说,使用您的解决方案是可行的,但它仅限于一组手动页面。

考虑到这一点,我认为你是在正确的轨道上。

在每个页面上,您都会有指向其他页面的链接。您知道这些页面链接到 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 回答