页面postback导致urlrewrite失败
我用的是类似nGallery的url rewrite方式,但是发现了一个问题,rewrite后的页面不能postback,否则真实的地址就会出现在地址栏里面。具体步骤是这样的。
先在webapp下建一个目录(如”Manage”),里面放defualt.aspx 和 web.config, default.asp可以任意内容,web.config里放这么一段
<httpHandlers>
<add verb=”*” path=”*.*” validate=”false” type=”jxLib.Handlers.MngRequestHandler, jxLib” />
</httpHandlers>
MngRequestHandler继承IhttpHandler,在ProcessRequest的最后,用context.Server.Transfer进行实际的rewrite,
这样的话,页面第一次显示的的时候,urlrewrite是正确的,如 http://localhost/jx/Manage,
但是,如果在这个页面上进行了一次postback,浏览器的url就变成了rewrite后的地址,如http://localhost/jx/do.aspx?op=manage。
暂时还没有办法解决。
Feedback
想办法把Action地址改写为http://localhost/jx/Manage
Asp.net Forum的源代码里有示例。
出现这种情况的原因是:在呈现 Web 窗体时,它会将其操作属性直接设置为 Request 对象中文件路径的值。
不幸的是,Web 窗体不允许您明确指定操作属性,也不允许您设置某些属性以禁用操作属性的呈现。因此,必须自己来扩展 System.Web.HtmlControls.HtmlForm 类,覆盖 RenderAttribute() 方法并明确指出它不会呈现操作属性。
由于继承功能,可以获得 HtmlForm 类的所有功能。以下显示了自定义类的完整代码:
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);
}
}
}
已被覆盖的 RenderAttributes() 方法的代码仅包含 HtmlForm 类的 RenderAttributes() 方法的准确代码,而不设置操作属性。(我使用 Lutz Roeder 的 Reflector 来查看 HtmlForm 类的源代码。)
创建此类并对其进行编译之后,要在 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>
注意:如果要重写的目标 URL 没有执行回发,则无需使用此自定义 Web Form 类。
最后还是得告诉你一个不幸的消息,通过上面的代码你的验证控件将不能发挥作用.目前我还没有找到合适的方法.
<script>
document.forms[0].action = "[你要Post的Url或<%=指向的Url%>]";
</script>
<script>
document.forms[0].action = locahost.href;
</script>
这种方法应该是最简单的,而且不用去做任何配置
你的方法是最简单的,呵呵,但是,如果高级用户查看一下源代码的话,就可以看到真实的action地址了。会不会暴露了本来想隐藏的东西呢?
刚才试了一下你的方法,没有试验成功。但是action地址确实已经被改写了,现在还在尝试中……
如果移除FORM的action属性,应该是默认提交到当前页面
我这没有例子,你这样试试看
document.forms[0].removeAttribute("action", true);
http://www.cnblogs.com/xspin/articles/30788.aspx
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
namespace ActionlessForm
{
/// <summary>
/// The Form class extends the HtmlForm HTML control by overriding its RenderAttributes()
/// method and NOT emitting an action attribute.
/// </summary>
public class Form : System.Web.UI.HtmlControls.HtmlForm
{
/// <summary>
/// The RenderAttributes method adds the attributes to the rendered <form> tag.
/// We override this method so that the action attribute is not emitted.
/// </summary>
protected override void RenderAttributes(HtmlTextWriter writer)
{
/*
// write the form's name
writer.WriteAttribute("name", this.Name);
base.Attributes.Remove("name");
// write the form's method
writer.WriteAttribute("method", this.Method);
base.Attributes.Remove("method");
// remove the action attribute
base.Attributes.Remove("action");
// finally write all other attributes
base.Attributes.Render(writer);
if (base.ID != null)
writer.WriteAttribute("id", base.ClientID);
if (base.Attributes["Validator"] == "Y")
writer.WriteAttribute("onsubmit", "ValidatorOnSubmit();");
*/
//writer.WriteAttribute("action", "");
//base.RenderAttributes(writer);
System.Text.StringBuilder sb = new System.Text.StringBuilder();
System.IO.StringWriter sw = new System.IO.StringWriter( sb );
System.Web.UI.Html32TextWriter w = new System.Web.UI.Html32TextWriter(sw);
base.RenderAttributes(w);
string html = sb.ToString();
w.Close();
int start = html.IndexOf("action=\"") + 8;
int end = html.IndexOf("\"", start);
html = html.Remove( start, end - start );
writer.Write( html );
}
}
}
<urlform:form id="formid" runat="server" method="post">
</urlform:form>

浙公网安备 33010602011771号