例如我们将一个地址"showpost.aspx?postid=1000"重写为"posts/1000.aspx",如果这个页面中有个表单(form),那么输出到浏览器的HTML中,这个表单的action属性为<form action="showpost.aspx?postid=1000">而不是我们期望的<form action="1000.aspx">,这样就会暴露我们的真实地址,而且感觉也不爽。
我们可以通过自定义页面基类,重写默认的HtmlTextWriter方法,重写属性输出WriteAttribute(string name, string value, bool encode)方法,当输出action时,将action属性的值强制转换为当前虚URL(HttpContext.Current.Request.RawUrl,上面的1000.aspx)
最后就是让所有的页面都调用这个基类,修改一下Web.config就好了
<!-- Openlab.Controls.OLPage为页面基类,Openlab.Controls为基类所在dll -->
<pages pageBaseType="Openlab.Controls.OLPage, Openlab.Controls"/>
附页面基类完整代码(参考CS代码完成):
using System;
using System.IO;
using System.Web;
using System.Web.UI;
![]()
namespace Openlab.Controls
...{
/**//// <summary>
/// 页面基类
/// </summary>
public class OLPage : Page
...{
public OLPage()
...{
}
![]()
Render#region Render
![]()
/**//// <summary>
/// 重写默认的HtmlTextWriter方法,修改form标记中的value属性,使其值为重写的URL而不是真实URL。
/// </summary>
/// <param name="writer"></param>
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);
}
#endregion
![]()
![]()
}
![]()
FormFixers#region FormFixers
![]()
FormFixerHtml32TextWriter#region FormFixerHtml32TextWriter
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)
...{
// 如果当前输出的属性为form标记的action属性,则将其值替换为重写后的虚假URL
if (_url != null && string.Compare(name, "action", true) == 0)
...{
value = _url;
}
base.WriteAttribute(name, value, encode);
}
}
#endregion
![]()
FormFixerHtmlTextWriter#region FormFixerHtmlTextWriter
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);
}
}
#endregion
![]()
#endregion
}
打印 | 张贴于 2005-03-10 16:53:00 | Tag:Web技术
目前致力于



}
留言反馈
lfkasdlfkjasdlkfads
llkjdfklasdjflkasdjfolasdf
flkasdjfklasjdflkasd
<pages pageBaseType="Openlab.Controls.OLPage, Openlab.Controls"/>
这个怎么配置?
action值是变成虚拟的了
但提交似乎没有用了
断点调试过
button_click事件触发不了
就出错了
配置错误
说明: 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。
分析器错误信息: “pageBaseType”属性必须设置为有效的类型名(格式: <typename>,<assemblyname>)
总是说格式不对。我搞了好久。还是没有解决,特来请教
在asp.net2.0中编译出错。
这是为什么啊?
再次打搅宝玉,不知RewritePath的传递参数为何传递不过去呢? 其中有什么玄机?
RewritePath(string,string,queryString)的参数不能取得到,这是why呢?应该有一个前后初始化的过程,可惜没有找到,晕啊
总结这次的过程,目的是通过静态url来提高搜索引擎的robot搜索,动态页面url过长robot的搜索是不会收录的。
现在就最后这一丁点问题,把人卡死。晕。其他地方都没有搜索到相关信息,所以才来此打搅宝玉的宝贵时间,真是不好意思。
设置IIS的映射的时候,把“检查文件是否存在”的勾去掉
context.RewritePath(newUrl)后,从一个虚地址转向实际的一个go.aspx,但是说无法找到资源,请宝玉指点一下。
我预设:
1,Url路径指向虚的.shtml文件
2,Application_BeginRequest中解析为自己的.aspx文件
3,iis中设置.shtml的解析使用aspx的解析\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll
这样做对我本身工作量小点,简单问题对不知道的人是天大的难题,还请指点一二。
第一次是AuthorizeRequest时,将posts/1000.aspx重写为aspxshowpost.aspx?postid=1000。
第二次是PreRequestHandlerExecute时,将Url重写回posts/1000.aspx
各有各的优缺点
报错,我检查过,对的阿
<system.web>
<pages pageBaseType="URl.OLPage,URl"
autoEventWireup="true"/>
。。。。。
回发后就不是虚拟的url。
但是在cs里
namespace URl
{
public class WebForm1:OLPage
{
就可以隐藏真实的url。请问为什么,谢谢!
好好学习一下!!
<pages pageBaseType="Openlab.Controls.OLPage, Openlab.Controls"/>
加在什么地方?
在cs_Post_Categories中包括了SectionID,同时也是作为对Section下一级的扩展,这种扩展不会影响Section本身,也就是说如果改动了Section的设置,不会影响到Section下的内容,cs_Post_Categories中包含ParentID字段,可以方便的进行多级目录嵌套,从而实现目录树结构。CategoryType字段用于识别分类的类型,目前的类型有ForumPost = 1,BlogPost = 2,BlogArticle = 3,GalleryPicture = 4,CalendarEvent = 5。
cs_Posts_InCategories表只有三个字段CategoryID,PostID,SettingsID,在我的设计中信息与信息分类通常用两个表完成,如Categories表与Posts表,Posts表中给出一个字段叫CategoryID,然后对Categories中的CategoryID进行关系连接,从而得出该信息的所属类。但是这样设计无法解决一个问题:同一篇文章要在两个类中同时显示,而不重复信息在Posts表中。而利用三个表(CS中所采用的)可以很好解决这个问题,增加程序的弹性,可以单一也可以重复。CS的Blog中发表的文章就可以同时在多个分类中进行显示,原理很简单,只要在cs_Posts_InCategories中提交CategoryID,PostID的引用即可。
个人的一点分析,仅供参考用。
另外,宝玉,ApplicationType枚举与CategoryType枚举中都有Calendar = 4,CalendarEvent = 5。,是不是CS中还有新的项目要加入,而且很可能是一个类似Hotmail中日程安排类的项目?
原来继承的是nGalleryPage : System.Web.UI.Page
现在我改写nGalleryPage : CSPage //System.Web.UI.Page
在图片的详细页面中就无法回复
我的原来的是Request.QueryString["id"]&Request.QueryString["tid"]
now action 没有这样的id 自然我也得不到遮样的参数
不知道宝玉如何解决遮样的问题
to voodgen :
我继承这个基类,提交没有任何问题!
CS中也不会有这个问题
我不知道为什么cs_Groups中没有ParentID字段,是我了解CS不够深还是CS中原本就没有这样的设计,增加ParentID字段对现有的几个组件可能帮助不大(有些论坛的Group支持不限级别的嵌套,CS中好像目前没有),但是扩展性就差了点,Group与Section如果看作是Categories,也只有两级。
但是我从CSPage继承过来的页面提交按钮就是不起作用
下载的cs source在我的本级中运行是没有问题的
这样做对aspx和ascx的代码基本没有改动
提交按钮实效可能是因为升级.net framework sp1的缘故
这是怎么回事?
不过我一般用dotnet做的b/s程序,很少有在form中带server属性的