ASP.NET URL伪静态重写实现方法

 更新时间:2009年12月10日 20:21:53   作者:   我要评论

ASP.NET下为静态的实现方法。
在web.config里设置如下:
复制代码 代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<!--overred-->
<configuration>
<configSections>
<section name="RewriterConfig"type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
</configSections>
<RewriterConfig>
<Rules>
<RewriterRule>
<LookFor>~/d(\d+)\.aspx</LookFor>
<SendTo>~/default.aspx?id=$1</SendTo>
</RewriterRule>
</Rules>
</RewriterConfig>
<system.web>
<httpHandlers>
<add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
</httpHandlers>
</system.web>
</configuration>

其中
<section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />

用于指定配置节"RewriterConfig"的处理程序类的名称为”URLRewriter.Config.RewriterConfigSerializerSectionHandler”,该类存在于bin目录下的URLRewriter .dll文件中
关键的是这两句
<LookFor>~/d(\d+)\.aspx</LookFor>
<SendTo>~/default.aspx?id=$1</SendTo>
<LookFor>~/d(\d+)\.aspx</LookFor>
表示,用户输入的url,d(\d+)\.aspx是 url中文件名匹配的正则表达式(此处为字母d开头,后面跟一个或多个数字,并以.aspx结尾。用户也可根据自己的需要自行设定)。
<SendTo>~/default.aspx?id=$1</SendTo>
,表示当服务器接收到符合上面条件的请求后如何重 写url。此处表示访问defalutl.aspx并传入参数id,其值$1将用用户请求的文件名中的第一个数字来表示。
例如用户输入 hostname/d11.aspx, 服务器会把他重写为http://hostname/default.aspx?id=11。换句话说用户输入http: //hostname/d11.aspx,实际访问的是http://hostname/default.aspx?id=11。这样就起到了隐藏真实文件名,并便于用户记忆的作用。
处理回发
在重写后的url里如果产生回发,例如有一个按钮,又调用了该被重写的aspx,用户浏览器中将会显示该aspx文件实际的地址,也就是http: //hostname/default.aspx?id=11。但从用户的角度考虑,如 果单击按钮时突然看到 URL 更改会使他们感到不安。因此必须解决这个问题。
解决方法有二:
(1)自己定义一个Actionlessform类,在aspx中不再使用系统提供的form 标记
复制代码 代码如下:

namespace ActionlessForm
{
public class Form : System.Web.UI.HtmlControls.HtmlForm
{
protected override void RenderAttributes(HtmlTextWriter writer)
{
writer.WriteAttribute("name", this.Name);
base.Attributes.Remove("name");
writer.WriteAttribute("method", this.Method);
base.Attributes.Remove("method");
this.Attributes.Render(writer);
base.Attributes.Remove("action");
if (base.ID != null)
writer.WriteAttribute("id", base.ClientID);
}
}
}

创建此类并对其进行编译之后,要在 ASP.NET Web 应用程序中使用它,应首先将其添加到 Web 应用程序的 References 文件夹中。然后,要使用它来代替 HtmlForm 类,做法是在 ASP.NET 网页的顶部添加以下内容:
<%@ Register TagPrefix="skm" Namespace="ActionlessForm" Assembly="ActionlessForm" %>

然后,将 <form runat="server">(如果有)替换为:<skm:Form id="Form1" method="post" runat="server">
并将右边的 </form> 标记替换为:</skm:Form>
/******************************************/
以上的方法:页面会出现创建控制项发生错误情况,接下来介绍不用以上的方法
将页面的<%@ Register TagPrefix="skm" Namespace="ActionlessForm" Assembly="ActionlessForm" %>删除,将 :<skm:Form id="Form1" method="post" runat="server">
(如果有)替换为<form runat="server">并将右边的 </skm:form> 标记替换为:</Form>
然后执行下面的做法
(2)以上的是继承个form,第二种方法就是继承page,这样你不需要在aspx页中改任何东西。
代码:
复制代码 代码如下:

using System;
using System.IO;
using System.Web;
using System.Web.UI;
namespace URL
{
public class OLPage : Page
{
public OLPage()
{}
protected override void Render(HtmlTextWriter writer)
{
if (writer is System.Web.UI.Html32TextWriter)
{
writer = new FormFixerHtml32TextWriter(writer.InnerWriter);
}
else
{
writer = new FormFixerHtmlTextWriter(writer.InnerWriter);
}
base.Render(writer);
}}
internal class FormFixerHtml32TextWriter : System.Web.UI.Html32TextWriter
{
private string _url; // 假的URL
internal FormFixerHtml32TextWriter(TextWriter writer):base(writer)
{
_url = HttpContext.Current.Request.RawUrl;
}
public override void WriteAttribute(string name, string value, bool encode)
{
if (_url != null && string.Compare(name, "action", true) == 0)
{
value = _url;
}
base.WriteAttribute(name, value, encode);
}
}
internal class FormFixerHtmlTextWriter : System.Web.UI.HtmlTextWriter
{
private string _url;
internal FormFixerHtmlTextWriter(TextWriter writer):base(writer)
{
_url = HttpContext.Current.Request.RawUrl;
}
public override void WriteAttribute(string name, string value, bool encode)
{
if (_url != null && string.Compare(name, "action", true) == 0)
{
value = _url;
}
base.WriteAttribute(name, value, encode);
}}}

把这个文件编译成dll,并在你的项目中引用它。
然后把项目中的所有aspx文件对应的cs文件中的继承page类的代码改写为继承OLPage。
例如
public class WebForm1:page
改写为
public class WebForm1:URL.OLPage
这样就解决回发问题。
(3)通过客户端代码清除form的action。
对于ASPX页面,我们在客户端查看代码时会发现,它自动为form加入了action,并且地址就是开头所说的原始页面地址。而对于ASPX页面,若当它的action为空时也就将回发到当前地址。这样我们就可以通过在客户端清除action的方法,来实现回发后继续保持有地址。
在页面中加入以下代码即可:
<script type="text/javascript">try{document.forms[0].action=""}catch(ex){}</script>
这种方法应是最简单的,而且也不用改动原来的代码。

相关文章

  • 前台JS(jquery ajax)调用后台方法实现无刷新级联菜单示例

    前台JS(jquery ajax)调用后台方法实现无刷新级联菜单示例

    前台用AJAX直接调用后台方法,老有人发帖提问,没事做个示例详细介绍一下,感兴趣的朋友可以参考下
    2013-01-01
  • ASP.NET 页面中动态增加的控件、添加事件

    ASP.NET 页面中动态增加的控件、添加事件

    在ASP.NET中动态创建一个控件总是不那么顺利,特别是当对页面的Life Cycle不是那么了然的情况下!这里简单描述一下要求,然后提供一个解决方案,大家看看有没有更好的Idea,如果有的话就是我的大幸了,呵呵!
    2009-07-07
  • ASP.NET餐饮管理系统制作代码分享

    ASP.NET餐饮管理系统制作代码分享

    本文通过图片+代码的形式,详细的介绍了餐饮管理系统各部分功能及其实现方法。餐饮管理系统的制作必须有一条条理性的思维方可以做好,感兴趣的小伙伴们可以参考一下
    2015-09-09
  • ASP.NET中等安全模式的一些经验分享

    ASP.NET中等安全模式的一些经验分享

    如果你正在开发一个通用型的Web产品,比如BBS、CMS、BLOG这类的,那么,建议你阅读以下本篇文章。
    2010-01-01
  • ASP.NET实现上传Excel功能

    ASP.NET实现上传Excel功能

    本文主要介绍了ASP.NET 实现上传EXCEL,利用NOPI操作,转换得到DataTable的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • Discuz!NT金沙国际官网读写分离方案详解

    Discuz!NT金沙国际官网读写分离方案详解

    Discuz!NT这个产品在其企业版中提供了对‘读写分离’机制的支持,使对CPU及内存消耗严重的操作(CUD)被 分离到一台或几台性能很高的机器上,而将频繁读取的操作(select)放到几台配置较低的机器上,然后通过‘事务 发布订阅机制’,实现了在多个sqlserver金沙国际官网之间快速高效同步数据,从而达到了将‘读写请求’按实际负载 情况进行均衡分布的效果。
    2010-06-06
  • .NET简单工厂模式讲解

    .NET简单工厂模式讲解

    这篇文章主要为大家详细介绍了ASP.NET简单工厂模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • asp.net 实现静态页面累加访问量的三种方式

    asp.net 实现静态页面累加访问量的三种方式

    asp.net 实现静态页面累加访问量的实现代码,需要的朋友可以参考下。
    2010-03-03
  • .Net Core Api 使用版本控制详解

    .Net Core Api 使用版本控制详解

    Api的版本控制是Api开发中经常遇到的问题, 在大部分中大型项目都需要使用到Api的版本控制,这篇文章主要介绍了.Net Core Api 使用版本控制详解,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • ASP.NET显示农历时间改进版

    ASP.NET显示农历时间改进版

    这篇文章主要介绍了ASP.NET显示农历时间改进版,是针对前面一篇ASP.NET显示农历时间的改进版,实现了比较简单的封装,增加了易用性,非常具有实用价值,需要的朋友可以参考下
    2014-11-11

最新评论