ASP.NET URLREWRITE重写的URL切换问题,能否自动正则反射输出URL

demoooo 2010-12-20 05:23:30
url重写,一般都是先配置重写规则如:

virtualUrl="^~/(\d+).html"
toUrl = "~/Default.aspx?ID=$1"

这样就能通过访问/100.html重写到实际的default.aspx?id=100的地址。

然后在页面中这样写: <a href="/100.html"> 而不是原先的<a href="default.aspx?id=100">

假如要修改重写的地址,责要修改所有页面的重写链接,以及重写规则。很是麻烦!

--------------问题来了:
上面输出url的两个a瞄,一个是重写的,一个是未重写的实际地址。 如何自动切换,最笨的方法可能用if(重写==true)就输出/100.html,否则是默认的,在每一个a超连接上进行判断输出,这样很累。

能否通过一个方法自动反射出想要的链接呢, 如<a href="<%=getUrl("default.aspx?id=100") %>"> ,这个getUrl(string)的方法去读取规则,反射出virtualUrl地址,这样以后只需要修改重写规则,页面就会自动输出新的规则地址,无需再修改每个页面的超链接。还可以通过判断切换输出,如没开启重写,直接原样返回输出。

想要这个getUrl(string)的方法代码,不要非常详细,大致能实现即可。谢谢


因为getUrl传入的是实际url地址,而在规则里面toUrl的数据不是正则格式,只是匹配格式。这个可能有点难度,还得有点性能。 再谢!



...全文
247 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
sps888123 2010-12-24
  • 打赏
  • 举报
回复
msdn里就有Treeview控件的动态加载
richwong 2010-12-24
  • 打赏
  • 举报
回复
这里啊,这么多天没人回上一点相关的, 从博客园得一思路,感谢"明天.NET" 自己改写下,还有点小问题,清理下应该就好用. 这里贴出来,自己倒粪了。


protected void Page_Load(object sender, EventArgs e)
{

UrlRewriteRoute test = new UrlRewriteRoute();
//test.VirtualPath = @"~/数字(\d+)/字符(\w+)/字母([a-zA-Z]*)-无厘头(.*)\.html";
//test.ToUrl = @"~/1.aspx?字母=$3 字符=$2 无厘头=$4 数字=$1";

test.VirtualPath = @"~/([a-zA-Z]*)\/(.[0-9]*[a-zA-Z]*)/([0-9]*)/([0-9]*)/([a-zA-Z]*)\.aspx";
test.ToUrl = @"~/WebPage/$1/$2.aspx?classid=$2;page=$3;keys=$4";

var result = ReverseRoute(test);

Response.Write(test.VirtualPath + "<br/>" + test.ToUrl + "<br/><br/>");
Response.Write(result.VirtualPath + "<br/>" + result.ToUrl + "<br/>");

}

public static UrlRewriteRoute ReverseRoute(UrlRewriteRoute route)
{

UrlRewriteRoute result = new UrlRewriteRoute();


List<string> virtualList = new List<string>();
Regex virtualReg = new Regex(@"\((.+?)\)");
foreach (Match m in virtualReg.Matches(route.VirtualPath))
{
virtualList.Add(m.Groups[1].Value);
}
string[] virtual_strs = virtualList.ToArray(); //虚拟URL的正则组内容


Regex tourlReg = new Regex(@"\$(\d+)");
List<string> tourlList = new List<string>();
foreach (Match m in tourlReg.Matches(route.ToUrl))
{
tourlList.Add(m.Value);
}
string[] tourl_strs = tourlList.ToArray(); //实际URL的正则组内容

string New_toUrl = route.VirtualPath;
string New_virtualUrl = route.ToUrl;
int k =1;
foreach (string s in tourl_strs) //循环实际url
{
int i = Convert.ToInt32(s.TrimStart('$'));
if (virtual_strs.Length >= i)
{
New_virtualUrl = New_virtualUrl.Replace("$" + i.ToString(), string.Format("({0})", virtual_strs[i - 1]));
New_toUrl = New_toUrl.Replace("(" + virtual_strs[i - 1] + ")", "$"+k.ToString()); //这样防止正规则中不按顺序写也能反转对应
k += 1;
}

}

result.ToUrl = New_toUrl;
result.VirtualPath = New_virtualUrl;
return result;
}

public class UrlRewriteRoute
{
public string VirtualPath { get; set; }
public string ToUrl { get; set; }
}

demoooo 2010-12-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 q107770540 的回复:]
你可以将 重写的 正则语句写在配置文件中

页面中取此正则 来修改链接
[/Quote]

关键是正则怎么反置过来匹配,也就是反匹配替换输出.
demoooo 2010-12-23
  • 打赏
  • 举报
回复
在配置文件里,写4个规则,一正一反?

如:

virtualUrl="^~/(\d+).html"
toUrl = "~/Default.aspx?ID=$1"

反输出虚拟url的正规
fromUrl = "~/Default.aspx?ID=(\d+)"
outUrl = "^~/$1.html"
ACE生如夏花 2010-12-23
  • 打赏
  • 举报
回复
我曾经也因为伪静态的问题头疼了好长时间,我用的也不太熟,爱莫能助,帮忙顶一下!!
qianyin123 2010-12-23
  • 打赏
  • 举报
回复
好久没弄了。。我记得 应该是要引用 一个DLL 转伪静态。。WEB.CONFIG 里 要修改部分 传输后缀。。。。网上在找找吧 这种多的。。。。。
q107770540 2010-12-23
  • 打赏
  • 举报
回复
你可以将 重写的 正则语句写在配置文件中

页面中取此正则 来修改链接
liyf_liyunfeng 2010-12-22
  • 打赏
  • 举报
回复
找一下urlwriter.net组件。
demoooo 2010-12-21
  • 打赏
  • 举报
回复
是不是没办法,或没必要啊?
demoooo 2010-12-20
  • 打赏
  • 举报
回复
自己顶一下,期望的方法


// 我大概的写写,里面关键的集合匹配以及构造虚拟url的代码不知道怎样写了
// 希望高手帮忙. 或提供下其他的思路
public static getUrl(string originalUrl)
{
if(systemIsUrlRewrite)
{
foreach(reurl in reurls)//遍历重写的正则集合
{
if(originalUrl 匹配 reurl.toUrl)
{
return build_virtualUrl(reurl,originalUrl);//如果集合中有此url的重写规则,就输出此源url的虚拟url,也得用正则吧?

}
}
}
else
{
return originalUrl;//系统没开启url重写,直接返回原始url
}


}


子夜__ 2010-12-20
  • 打赏
  • 举报
回复
下班了 回家看 友情帮顶

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧