[英]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的原始出现(这将使列表变得无限长)。
如果您有兴趣或需要任何帮助,请告诉我。
我看到两个部分
我个人认为将其存储在查询字符串中是一个糟糕的主意。 您只需要使用上一个和下一个步骤关键字作为查询字符串,它就可以与网址集合中的上一个和下一个索引一样简单。
在屏幕上以某种方式向用户显示网址将提供一个不错的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.