如何透明地将URL参数从一个页面传递到另一个页面?

时间:2010-10-28 09:25:11

标签: c# asp.net

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

例如:

  1. 我们输入页面myPage1.aspx?param1 = test
  2. 执行Response.Redirect(myPage2.aspx)
  3. 这里我想将参数连接到URL并在结果中:
  4. 页面被重定向到myPage2.aspx?param1 = test
  5. 解决方案应该知道用户可以打开多个共享一个会话(身份验证)的应用程序实例。例如,在一个浏览器中打开myPage.aspx?param1 = test,在第二个浏览器中打开mypage.aspx?param1 = test2。

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

    可以吗?

3 个答案:

答案 0 :(得分:2)

如果您不想使用Session并且只想使用查询字符串参数

,则可以使用以下内容
  1. 您可以遍历所有查询字符串参数,例如
  2. int loop1,loop2;

    //加载NameValueCollection对象。

    NameValueCollection coll = Request.QueryString;

    //将所有键的名称放入字符串数组中。 String [] arr1 = coll.AllKeys;

    string parameters =“”;

    for(loop1 = 0; loop1< arr1.Length; loop1 ++) {

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

    for(loop2 = 0; loop2< arr2.Length; loop2 ++)    {

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

    } }

    它的基本理念。但是你可以在不知道名字的情况下循环参数。

    为避免在每个页面上编写代码,您可以定义类似

    的类

    public class QueryStringHelper {      public static string GetQueryString(KeyValuePair querystring)      {        //获取您的字符串并使用上述方法返回您的查询字符串       } }

    然后在页面PREINTI事件

    中的每个页面上
    protected override void preinit()
    {
           Response.Redirect("redirectpage.aspx" + QueryStringHelper(QueryString))
     }
    

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

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

答案 1 :(得分:1)

您可以使用Session对象执行此操作,而不是在QueryString上复制参数:

// 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。

答案 2 :(得分: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都通过此类的ResolveUrl()方法传递:

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

正如我所说,这是未经测试的,因为我现在没有时间确保它完全按照预期工作,但是会让您大致了解如何解决这个问题。