You must recursively build on the query string parameter returnUrl you move from page to page.
For example: https://dotnetfiddle.net/HtoX6b
var page0 = new Uri("http://www.example.com/page0"); Console.WriteLine("Page 0: {0}", page0); var page1 = new Uri("http://www.example.com/page1?paramA=foo¶mB=bar&returnUrl=" + HttpUtility.UrlEncode(page0.ToString())); Console.WriteLine("Page 1: {0}", page1); var page2 = new Uri("http://www.example.com/page2?paramC=baz¶mD=qux&returnUrl=" + HttpUtility.UrlEncode(page1.ToString())); Console.WriteLine("Page 2: {0}", page2); var page2ReturnUrl = HttpUtility.ParseQueryString(page2.Query)["returnUrl"]; Console.WriteLine("Return to page 1 from page 2: {0}", page2ReturnUrl); var page1ReturnUrl = HttpUtility.ParseQueryString(page1.Query)["returnUrl"]; Console.WriteLine("Return to page 0 from page 1 : {0}", page1ReturnUrl);
Page 0: http://www.example.com/page0 Page 1: http://www.example.com/page1?paramA=foo¶mB=bar&returnUrl=http:%2f%2fwww.example.com%2fpage0 Page 2: http://www.example.com/page2?paramC=baz¶mD=qux&returnUrl=http:%2f%2fwww.example.com%2fpage1%3fparamA%3dfoo%26paramB%3dbar%26returnUrl%3dhttp:%252f%252fwww.example.com%252fpage0 Return to page 1 from page 2: http://www.example.com/page1?paramA=foo¶mB=bar&returnUrl=http:%2f%2fwww.example.com%2fpage0 Return to page 0 from page 1 : http://www.example.com/page0
This may continue for many levels in depth, but the process of getting the previous URL is always the same - just decode the returnUrl parameter.
source share