有没有办法透明地通过网页传递网址参数?我的意思是当使用重定向时,已添加的参数将被传递到新页面,而无需程序员的直接操作。
例如:
解决方案应该知道用户可以打开多个共享一个会话(身份验证)的应用程序实例。例如,在一个浏览器中打开myPage.aspx?param1 = test,在第二个浏览器中打开mypage.aspx?param1 = test2。
我们在应用程序中已经有一些重定向(Response.Redirect),因此完美的解决方案不需要更改现有代码。
可以吗?
答案 0 :(得分:2)
如果您不想使用Session并且只想使用查询字符串参数
,则可以使用以下内容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");
正如我所说,这是未经测试的,因为我现在没有时间确保它完全按照预期工作,但是会让您大致了解如何解决这个问题。