2010-10-28 112 views
1

有没有办法透明地通过网页传递URL参数?我的意思是,当使用重定向时,已经添加的参数将被传递到新页面,而不需要程序员的直接操作。如何透明地将URL参数从页面传递到页面?

例如:

  1. 我们进入页面myPage1.aspx参数1 =测试
  2. 执行的Response.Redirect(myPage2.aspx)
  3. 在这里,我想参数要连接到的URL和在结果:
  4. 页面重定向到myPage2.aspx参数1 =测试

解决方案应该意识到,用户可以打开米?而不是共享一个会话的一个应用程序实例(身份验证)。例如,在一个浏览器中打开myPage.aspx?param1 = test,并在第二个浏览器中打开mypage.aspx?param1 = test2。

我们在应用程序中已经有一些重定向(Response.Redirect),所以完美的解决方案不应该要求更改现有的代码。

可以这样做吗?

回答

1

可以使用Session对象这样做的,而不是在查询字符串复制参数:

// in myPage1.aspx 
Session["url"] = myUrl; 


// in myPage2.aspx 
var passedInUrl = Session["url"]; 

另一种选择是使用cookies,以类似的方式:

// in myPage1.aspx 
Response.Cookies["url"] = "a url"; 

// in myPage2.aspx 
var passedInUrl = Request.Cookies["url"] 

两种方式适用于少量数据,但如果您想避免篡改(或能够发现篡改),则应该加密cookie。

+0

好的。但没有会话有没有办法?对程序员是透明的?我们在应用程序中已经有很少的重定向了,我希望它们保持完整。 – 2010-10-28 09:29:44

+0

@rkrass - 你可以使用cookies。为什么你想避免会话?如果您想要在页面请求之间保留少量数据,那就太好了。 – Oded 2010-10-28 09:31:22

+0

@Oded - 我们希望允许其他Web应用程序将参数传递给我们的应用程序。如果参数通过,我不想放松它。在一个会话中,用户可以打开多个浏览器窗口,因此我认为会话参数不能使用。 – 2010-10-28 09:36:07

2

,如果你不想使用会话,只是想使用的查询字符串参数

  1. 你可以通过你所有的查询字符串参数这样

INT LOOP1循环,循环2您可以使用下面;

//加载NameValueCollection对象。

NameValueCollection coll = Request.QueryString;

//获取所有键的名字到一个字符串数组中。 String [] arr1 = coll.AllKeys;

string parameters =“”;

为(LOOP1 = 0; LOOP1 < arr1.Length; LOOP1 ++){

参数+ = Server.HtmlEncode(ARR1 [LOOP1])+ “=” + coll.GetValues(ARR1 [LOOP1]) ;

for(loop2 = 0; loop2 < arr2。长度;循环2 ++){

parameters += Server.HtmlEncode(arr2[loop2]); 

}}

它只是基本思想。但是你可以在不知道名字的情况下遍历参数。

为了避免everypage你可以这样定义一个类编写代码

公共类QueryStringHelper { 公共静态字符串GetQueryString(KeyValuePair查询字符串) {// 让你的字符串,并使用上述方法返回的查询字符串 }}

然后在每一页上你将不得不在页面做PREINTI事件

protected override void preinit() 
{ 
     Response.Redirect("redirectpage.aspx" + QueryStringHelper(QueryString)) 
} 

我认为在everypage上复制这个事件不会是一个大问题。

AGAIN这个代码是基本的想法,这不会编译

+0

是的,但是有没有一个地方可以放置代码以避免重写使用重定向的旧代码? – 2010-10-28 09:45:29

+0

如果您不想加载页面并立即将其重定向,则可以使用页面的PreInit或Init事件来仅设置参数。 但是如果你想在重定向之前做一些事情,那么首先要做,然后重定向页面。 最好的办法是定义一个单独的类来获取参数并使用静态方法(public static string getquerystringparameters())并传递查询字符串对象并获取参数字符串(“para1 = value1&para2 = valu2”)作为回报附加到您的重定向页面。 – zish 2010-10-28 09:59:30

+0

它仍然需要在每个页面或其父类上添加此代码。我想避免这种情况。 – 2010-10-28 10:12:39

0

你可以有你实例化在每个网页,将帮助您处理该顶部的一类。我在下面写了一个例子。 ++请注意,这是未经测试,我只是把它在一起,给你一个想法++:

public class QueryStringState 
{ 
    private Dictionary<string, string> m_Params = new Dictionary<string, string>(); 
    private System.Web.UI.Page m_Page; 

    // ctor 
    public QueryStringState(System.Web.UI.Page _page, params string[] _persistArgs) 
    { 
     m_Page = _page; 
     foreach (string key in _page.Request.QueryString.Keys) 
     { 
      if (_persistArgs.Contains(key)) // are we persisting this? 
       m_Params[key] = _page.Request.QueryString[key]; 
     }; 
    } // eo ctor 

    // Resolve Url 
    public string ResolveUrl(string _url) 
    { 
     // Resolve the URL appropriately 
     string resolved = m_Page.ResolveUrl(_url); 

     // Add our arguments on to the Url. This assumes that they have NOT been 
     // put on the query string manually. 
     Uri uri = new Uri(resolved); 
     StringBuilder builder = new StringBuilder(uri.Query); 
     if(uri.Query.Length > 0) 
      builder.Append("&"); 
     int counter = 0; 
     foreach(KeyValuePair<string, string> pair in m_Params) 
     { 
      builder.AppendFormat("{0}={1}", pair.Key, pair.Value); 
      ++counter; 
      if(counter < m_Params.Count) 
       builder.Append("&"); 
     }; 

     return(string.Concat(resolved, builder.ToString())); 
    } 
}; 

让这个类是你的页面的成员:

private QueryStringState m_QueryStringState = null; 

和初始化过程中实例化,传递的任何参数的名称,你想通过网页上的查询字符串坚持:

m_QueryStringState = new QueryStringState(this, "param1", "param2"); 

然后,你必须确保该离开页面的任何URL都是通过这个CL的RESOLVEURL()方法中传递屁股:

myObject.HyperLink = m_QueryStringState.ResolveUrl("~/index/mypage.aspx"); 

正如我所说,这是未经测试,因为我没有时间,现在,以确保它的工作原理完全如预期,但给你这是如何解决的总体思路。