[横渡]
一直以来,我都这样轻轻的走着......
posts - 117,  comments - 249,  trackbacks - 4
昨天写了个URL重写,因为在重写后的URL里有一个小小的Bug的,就是在Post数据时会把原URL里的地址变成GET。

(ASP.net的URL重写文一)

比如原地址URL为:http://localhost/Test/Default.aspx
重写后的URL:http://localhost/Test/2004/12/News.aspx
而在Default.aspx文件里有Post数据(如Post文本)。那么这时重写后的URL就会变为:http://localhost/Test/2004/12/News.aspx?ID=12

显然,这不是我们想要的URL也不是标准的。

其实,有细读过在MS上的MSDN里的这篇文章的朋友都知道,里面已经有讲述了且问题也已经解决了的。
http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx

可能上面链接的文档相对较长,有朋友读完到URL重写后就没再往下看了。在文章下头里有细说明,怎么个把Form的Action清除掉。这里我所插一句的是:在ASP.net的页面WebForm里,一个页面只能有一个Form,但同时,这个Form的Action是不可变的(即只能Post数据回本页面)。如需要变动,则要自己写一个Form控件,此控件继承System.Web.UI.HtmlControls.HtmlForm接口。

这里是URLRewriter的源码下载:
http://upserver2.ys168.com/ys168up/D1/ys1.aspx?f=MSDNURLRewriting.msiy71z73f8b3f8b4b0f8z95b6b1f9b5f9f5f9b1f8b0b2b1f6e09e15e05e24b1b0f2b0f9f9b1f6b7f8b1z

在这个源码中,找到URLRewriter.dll和ActionlessForm.dll这两个DLL文件。其实一整个源码就只有这两个文件有用的。
第一个不用多说了,前文已经说了怎么用这个DLL。对于ActionlessForm.dll这个就是一个控件,用法也很简单:

首先把ActionlessForm.dll拷入你的项目中的bin目录,然后在你的VS.net的项目中引用这个dll。再在你原有的(即没重写的).aspx页面中

第一步:把这句加于代码顶部:
<%@ Register TagPrefix="skm" Namespace="ActionlessForm" Assembly="ActionlessForm" %>
第二步:
<form id="Form1" method="post" runat="server">和</form>
替换成:
<skm:Form id="Form1" method="post" runat="server">和</skm:Form>

OK,现在你可以再运行程序试试了。
----------

附:为什么URL就会变为:http://localhost/Test/2004/12/News.aspx?ID=12
其实很简单,因为在web.config中有这样的一句:
<SendTo>~/Default.aspx?ID=$2</SendTo>
在没有替换form之前,你查看页面的源码就可以看到,你的form的Action是到(以上面的例子):Default.aspx?ID=12
即.aspx页面最后生成的HTML是:
<form id="Form1" name="Form1" method="post" action="Default.aspx?ID=12"></form>

还有,如果想用URL重写后的格式为以目录形式即不用加Default.aspx:
http://localhost/Test/2004/12
则要新建相应的目录和文件Default.aspx。
如上例子:http://localhost/Test/2004/12
则要新建2004目录和在此目录下新建12目录,再在12目录下新建Default.aspx文件。文件内容可为空。

至于为什么,是因为IIS如没有找到目录或文件时会报错。
posted on 2005-06-21 14:17 横渡 阅读(5171) 评论(10)  编辑 收藏 网摘 所属分类: [ ASP.net ]

FeedBack:
2005-06-22 09:00 | yifei
今天一早跑到博客園首頁就看到你文章了,寫得不錯。
  回复  引用    
2005-06-22 18:01 | 西瓜满屋飞      
我如果想把后缀从写成.html用这种方法好像不行,我看可以用iis来控制,但是弄了半天没弄出来。可以指教下么

  回复  引用  查看    
2005-06-23 08:49 | HD
TO:西瓜满屋飞
.htm这类扩展名因为IIS的ISAPI里有配制,所以在程序还没执行IIS已经处理且报错了。
解决方法是把在IIS里的.htm的解释DLL转为.aspx的即可。

  回复  引用    
2005-08-30 23:19 | 17ak[未注册用户]
<%
if (Request.UrlReferrer!=null && !Request.UrlReferrer.ToString().ToLower().StartsWith("http://www.bbsky.com.cn"">http://www.bbsky.com.cn"))
{
Response.Write("<script>document.write('本网站是非法盗用宽频世界资源,请通过正常途径访问!http://www.bbsky.com.cn');</script>");
Response.End();
}
else if (Request.UrlReferrer==null)
{
%>
<script language="JavaScript">
try {
var strVariable = new String(window.opener.location);
if (strVariable.toLowerCase().indexOf("http://www.bbsky.com.cn"">http://www.bbsky.com.cn")!=0)
{
alert("本网站是非法盗用宽频世界资源,请通过正常途径访问!http://www.bbsky.com.cn"">http://www.bbsky.com.cn");
document.location="http://www.bbsky.com.cn"">http://www.bbsky.com.cn";
}
}
catch(e) {}
</script>
<% } %>

网页前加了以上语句 不能链接 如何破解

  回复  引用    
2005-09-07 11:20 | pwqzc[未注册用户]
写的很好,但是有个问题
如果没有那个目录存在也希望url重写的话就辉出现404错误
不知道怎么样去解决这个问题呢?

  回复  引用    
2006-02-16 23:45 | bisou.cn[未注册用户]
为什么我的网站url重写以后就不能被google收录呢?

问题帖子在csdn

http://community.csdn.net/Expert/topic/4550/4550298.xml?temp=.9966852

这是代码的帖子
http://community.csdn.net/Expert/topic/4545/4545068.xml?temp=.2582971

谁能帮我看看

  回复  引用    
2006-06-20 09:58 | qian81[未注册用户]
我回发的不对<skm:Form id="Form1" method="post" runat="server">

  回复  引用    
2006-07-27 18:51 | ljk[未注册用户]
怎么下载不了呀??
  回复  引用    
2007-03-27 16:28 | SoftWareBoy[未注册用户]
@HD
怎样把在IIS里的.htm的解释DLL转为.aspx啊!
请指教!!!

  回复  引用    
2007-06-15 03:34 | lllll[未注册用户]
khjuihuiguioo''
  回复  引用    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 178367 953UqtDSZ1c=



相关文章:

相关链接:

展开音乐播放器

与我联系

搜索

 

留言簿

随笔分类

文章分类

相册

收藏夹

[好站好点]

[我的地盘]

[友情链接]

积分与排名

  • 积分 - 83199
  • 排名 - 721