繁体   English   中英

在查询字符串中存储以前的URL的巧妙方法(ASP.NET C#)

[英]Clever way to store previous url's in querystring (ASP.NET C#)

我正在寻找一种聪明的方法来将先前的url(以正确的顺序)存储在我存储在querystring中的值(最好是整数)中。

例如,我有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中需要它,以便可以从另一个网站引用它

也许我已经简化了一下,但是为什么不将它们存储在列表中,而每次用户进入新页面时都继续添加就可以添加到列表中。 然后,当您想弄清楚他们去过哪里时,只需从列表末尾倒数即可。

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;

我已经写了一个可能对您有帮助的导航框架, 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),则将历史记录截断为该Page的原始出现(这将使列表变得无限长)。

如果您有兴趣或需要任何帮助,请告诉我。

我看到两个部分

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

我个人认为将其存储在查询字符串中是一个糟糕的主意。 您只需要使用上一个和下一个步骤关键字作为查询字符串,它就可以与网址集合中的上一个和下一个索引一样简单。

在屏幕上以某种方式向用户显示网址将提供一个不错的UX。 在这种情况下,您需要枚举显示文本和网址。 以最简单的形式

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

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

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

使用堆栈解决了我的目的,每当用户从一个页面导航到另一页面时,只需将当前页面路径推入堆栈,然后当用户单击“取消”按钮时,从堆栈中读取上一页并将其重定向到该页面即可。

有一个带有一个属性Path的类PreviousPath

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

    }

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

public string GetPreviousPage()
    {
        string url;
        if (PageStack != null && PageStack.Count > 0)
        {
            url = PageStack.Pop().Path;
        }
        else
        {
            url = "/default.aspx";
        }
        return Redirect(url);
    }

每个人的建议都很好,但是我从您的问题中得到的是,您可能希望存储此值,以后再读回来。

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

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

考虑到这一点,我认为您走在正确的道路上。

在每个页面上,您将具有指向其他页面的链接。 您知道这些页面链接到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(',');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM