ASP.NET URL伪静态重写实现方法_实用技巧

在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>
这种方法应是最简单的,而且也不用改动原来的代码。

时间: 2024-12-30 10:44:56

ASP.NET URL伪静态重写实现方法_实用技巧的相关文章

asp.net URL 显示乱码 解决方法_实用技巧

比如你传入汉字,或者传入"§"等其他编码格式的字符串系统解析后的url为乱码.经过在网上的查找觉得一下两种方式比较好: 1.如果url在后台解析的话采用HttpUtility.UrlEncode(url,System.Text.Encoding.GetEncoding("编码格式(GB2312)")); 2.如果是传入前台的话在组织URL时对传递信息进行编码.编码方法可以写到js文件中使用encodeURIComponent(source)函数,其中source为中

三种asp.net页面跳转的方法_实用技巧

第一种方法:response.redirect这个跳转页面的方法跳转的速度不快,因为它要走2个来回(2次postback),但它可以跳转到任何页面,没有站点页面限制(即可以由雅虎跳到新浪),同时不能跳过登录保护.但速度慢是其最大缺陷!redirect跳转机制:首先是发送一个http请求到客户端,通知需要跳转到新页面,然后客户端在发送跳转请求到服务器端.需要注意的是跳转后内部空间保存的所有数据信息将会丢失,所以需要用到session.代码如下  using System; using System

Asp.NET调用百度翻译的方法_实用技巧

本文实例讲述了Asp.NET调用百度翻译的方法.分享给大家供大家参考.具体分析如下: Asp.NET调用百度翻译,如下图所示: HTML代码如下: 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="baidu.aspx.cs" Inherits="FanYi_baidu" %>  <!DOCTYPE html PUBLIC &

Asp.net 5种页面转向方法_实用技巧

标签 1.<a href="test.aspx"></a> 2.这是最常见的一种转向方法; HyperLink控件 1.Asp.net 服务器端控件 属性NavigateUrl指定要跳转到的Url地址 2.NavigateUrl是可以在服务器端使用代码修改,这个区别于<a> 3.由于HyperLink本身没有事件所以要在服务器端其它事件中设置NavigateUrl 4.代码示例 <Asp:HyperLink id="hyperlink

asp.net实现输出xml的方法_实用技巧

本文实例讲述了asp.net实现输出xml的方法.分享给大家供大家参考,具体如下: #region 根据xml节点 查询xml节点的值并作修改 /// <summary> /// 根据xml节点 查询xml节点的值并作修改 /// </summary> /// <param name="fileName">要加载的xml文件</param> /// <param name="tagName">xml节点的名

asp.net中调用存储过程的方法_实用技巧

本文实例讲述了asp.net中调用存储过程的方法.分享给大家供大家参考,具体如下: 一.建立并调用一个不带参数的存储过程如下: CREATE PROCEDURE 全部学生<dbo.selectUsers> AS SELECT * FROM 学生 GO EXEC 全部学生 建立并调用一个带参数的存储过程如下: CREATE PROCEDURE 学生查询1 @SNAME VARCHAR(8),@SDEPT VARCHAR(20) AS SELECT * FROM 学生 WHERE 姓名=@SNAM

ASP.NET显示渐变图片实现方法_实用技巧

先给大家来个最终效果: 实现效果,首先准备一张图片,高度为25pixel,宽度为1至3pixel渐变的图片.可以这里下载. 还要准备数据: Dictionary<int, int> Datas { get { Dictionary<int, int> d = new Dictionary<int, int>(); d.Add(1, 35); d.Add(2, 45); d.Add(3, 20); return d; } } ok,数据准备完了,在aspx里放三个Labe

ASP.NET使用TreeView显示文件的方法_实用技巧

本文实例讲述了ASP.NET使用TreeView显示文件的方法,是非常实用的技巧.分享给大家供大家参考.具体实现方法如下: 通常在ASP.NET中,TreeView的使用很普遍,这里详细讲述一下使用TreeView显示文件的方法. 1.首先加入TreeView控件: <asp:TreeView ID="driverInfoView" runat="server" ImageSet="XPFileExplorer" OnTreeNodePop

ASP.NET显示农历时间的方法_实用技巧

本文实例讲述了ASP.NET显示农历时间的方法.分享给大家供大家参考.具体实现方法如下: CS部分代码如下: 复制代码 代码如下: public string ChineseTimeNow = "";  public string ForignTimeNow = "";  private static ChineseLunisolarCalendar calendar = new ChineseLunisolarCalendar();  private static