发现CS的一个小问题.没有彻底解决.
今天看cs代码,发现了一个小问题,如下:
当前为匿名用户,浏览到一个需要通过身份验证的版面时,页面会转向登陆页,Url是这样的:
/login.aspx?ReturnUrl=/CnForums/forums/AddPost.aspx?ForumID=3 , 这里都是正常的,考虑这样一种情况,如果当前用户没有注册过站点的会员,这时候点击注册,Url会成为/user/CreateUser.aspx?ReturnUrl=/CnForums/forums/AddPost.aspx?ForumID , 看到错误了吧,ReturnUrl参数被截断了.ForumID后面的内容没有了.正确的应该是ReturnUrl=/CnForums/forums/AddPost.aspx?ForumID=3,分析一下原因.在CommunityServer.Components命名空间中找到SiteUrls类,先看看public virtual string UserRegister的代码,我在代码上加上了注释,所以不再多写.
cs中许多地方用到了ReturnUrl,方法都是相同的.上面的代码中有一个方法很重要.ExtractQueryParams(string s).
如果当前路径中已经存在ReturnUrl参数的话,他就会从当前路径中取出ReturnUrl,所以我上面描述的问题应该是在这里发生了问题.先看看他的代码吧,我看了很多评论者总在抱怨别人只帖代码,实质的内容比较少,但我觉得代码才是最有力的论据,当然适当的加上一些说明效果会更好.
if (pair.Length > 1)
value = pair[1];这里的判断有问题,它没有考虑当路径中已经存在ReturnUrl参数的时候,很有可能ReturnUrl参数的值里还有1个或2个或更多的=号或?号.所以出现了我前面说的丢失参数的情况/user/CreateUser.aspx?ReturnUrl=/CnForums/forums/AddPost.aspx?ForumID. 不过我还没有找到比较好的解决办法.只是在判断pari.Length之前,先判断了一下if((pair.Length % 2) != 0),代码如下:
//url被截断.需要判断当前是否存在ReturnUrl参数,如果存在就不能这样转换.
//如果ReturnUrl的值有两个参数,这个方法依然是错的.
if((pair.Length % 2) != 0)
{
value = pair[1] + "=" + pair[2];
}
else
{
value = pair[1];
}这样的判断方法只能用在cs这种特例中,只能是临时解决问题的方法.哪位有好的解决方法记得通知我一声.
我看了cs2.0好像已经没有这个问题了,不过还没看过cs2.0的代码,有时间再说吧.
当前为匿名用户,浏览到一个需要通过身份验证的版面时,页面会转向登陆页,Url是这样的:
/login.aspx?ReturnUrl=/CnForums/forums/AddPost.aspx?ForumID=3 , 这里都是正常的,考虑这样一种情况,如果当前用户没有注册过站点的会员,这时候点击注册,Url会成为/user/CreateUser.aspx?ReturnUrl=/CnForums/forums/AddPost.aspx?ForumID , 看到错误了吧,ReturnUrl参数被截断了.ForumID后面的内容没有了.正确的应该是ReturnUrl=/CnForums/forums/AddPost.aspx?ForumID=3,分析一下原因.在CommunityServer.Components命名空间中找到SiteUrls类,先看看public virtual string UserRegister的代码,我在代码上加上了注释,所以不再多写.
1
public virtual string UserRegister
2
{
3
get
4
{
5
//取得当前路径
6
string currentPath = CSContext.Current.Context.Request.Url.PathAndQuery;
7
string returnUrl = null;
8![](/Images/OutliningIndicators/InBlock.gif)
9
//判断是否有ReturnUrl参数,如果有,就把ReturnUrl赋值给上面定义的returnUrl变量
10
if (ExtractQueryParams(currentPath)["ReturnUrl"] != null)
11
returnUrl = ExtractQueryParams(currentPath)["ReturnUrl"];
12![](/Images/OutliningIndicators/InBlock.gif)
13
//这里就判断returnUrl变量是否为空,如果为空就把新Url的ReturnUrl赋值为当前路径currentPath
14
if ((returnUrl == null) || (returnUrl == string.Empty))
15
return urlData.FormatUrl("user_Register", currentPath);
16
else
17
return urlData.FormatUrl("user_Register", returnUrl);
18![](/Images/OutliningIndicators/InBlock.gif)
19
}
20
}
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](/Images/OutliningIndicators/InBlock.gif)
4
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/InBlock.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
20
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
cs中许多地方用到了ReturnUrl,方法都是相同的.上面的代码中有一个方法很重要.ExtractQueryParams(string s).
如果当前路径中已经存在ReturnUrl参数的话,他就会从当前路径中取出ReturnUrl,所以我上面描述的问题应该是在这里发生了问题.先看看他的代码吧,我看了很多评论者总在抱怨别人只帖代码,实质的内容比较少,但我觉得代码才是最有力的论据,当然适当的加上一些说明效果会更好.
1
protected static NameValueCollection ExtractQueryParams(string url)
2
{
3
int startIndex = url.IndexOf("?");
4
NameValueCollection values = new NameValueCollection();
5![](/Images/OutliningIndicators/InBlock.gif)
6
if (startIndex <= 0)
7
return values;
8![](/Images/OutliningIndicators/InBlock.gif)
9
string[] nameValues = url.Substring(startIndex + 1).Split('&');
10![](/Images/OutliningIndicators/InBlock.gif)
11
foreach (string s in nameValues)
12
{
13
string[] pair = s.Split('=');
14![](/Images/OutliningIndicators/InBlock.gif)
15
string name = pair[0];
16
string value = string.Empty;
17![](/Images/OutliningIndicators/InBlock.gif)
18
if (pair.Length > 1)
19
value = pair[1];
20![](/Images/OutliningIndicators/InBlock.gif)
21
values.Add(name, value);
22
}
23![](/Images/OutliningIndicators/InBlock.gif)
24
return values;
25
}
这里描述起来有点复杂,没有很多时间写,以后补上来.错误的地方就是在遍历url键值对的时候,
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](/Images/OutliningIndicators/InBlock.gif)
4
![](/Images/OutliningIndicators/InBlock.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/InBlock.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
我看了cs2.0好像已经没有这个问题了,不过还没看过cs2.0的代码,有时间再说吧.
作者:vincent zhang
出处:http://ode.cnblogs.com http://odevincent.blog.51cto.com
Email:wensheng.zhang#postgres.cn
![知识共享许可协议](http://i.creativecommons.org/l/by-nc-nd/3.0/cn/88x31.png)
本作品由vincent zh创作,采用知识共享署名-非商业性使用-禁止演绎 3.0 中国大陆许可协议进行许可。