chiname

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

页面postback导致urlrewrite失败

我用的是类似nGalleryurl 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

# re: 页面postback导致urlrewrite失败   

2005-09-27 10:19 by oop80
接下来我打算用httpsniffer看看是不是服务器返回了真实的url。

# re: 页面postback导致urlrewrite失败   

2005-09-27 10:46 by Addie
原因是你的Form的Action地址是http://localhost/jx/do.aspx?op=manage,所以Postback后,浏览器的url就变成了rewrite后的地址。

想办法把Action地址改写为http://localhost/jx/Manage

Asp.net Forum的源代码里有示例。

# re: 页面postback导致urlrewrite失败   

2005-09-27 10:47 by Goodspeed
其实你看一下生成的form标签的action, 你就会明白为什么.

出现这种情况的原因是:在呈现 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 类。

最后还是得告诉你一个不幸的消息,通过上面的代码你的验证控件将不能发挥作用.目前我还没有找到合适的方法.


# re: 页面postback导致urlrewrite失败   

2005-09-27 11:03 by 宝玉
FYI
http://blog.joycode.com/dotey/archive/2005/03/10/45572.aspx

# re: 页面postback导致urlrewrite失败   

2005-09-27 11:08 by Lion
在页面底部加上
<script>
document.forms[0].action = "[你要Post的Url或<%=指向的Url%>]";
</script>

# re: 页面postback导致urlrewrite失败   

2005-09-27 11:30 by Lion
或者是
<script>
document.forms[0].action = locahost.href;
</script>

这种方法应该是最简单的,而且不用去做任何配置

# re: 页面postback导致urlrewrite失败   

2005-09-27 11:32 by oop80
to all
确实,form的action被改成了实际的请求地址。
学习中,呵呵

# re: 页面postback导致urlrewrite失败   

2005-09-27 11:33 by oop80
to lion
你的方法是最简单的,呵呵,但是,如果高级用户查看一下源代码的话,就可以看到真实的action地址了。会不会暴露了本来想隐藏的东西呢?

# re: 页面postback导致urlrewrite失败   

2005-09-27 11:40 by jzywh
微软的sample里面还有个 ActionlessForm,

用他就可以了

# re: 页面postback导致urlrewrite失败   

2005-09-27 11:42 by oop80
to jzywh
我来找找看。

# re: 页面postback导致urlrewrite失败   

2005-09-27 11:49 by oop80
to lion
刚才试了一下你的方法,没有试验成功。但是action地址确实已经被改写了,现在还在尝试中……

# re: 页面postback导致urlrewrite失败   

2005-09-27 12:57 by Lion
已经被改写了,那么就可以提交到你要指定的URL页面,为什么还没有成功?


如果移除FORM的action属性,应该是默认提交到当前页面
我这没有例子,你这样试试看
document.forms[0].removeAttribute("action", true);

# re: 页面postback导致urlrewrite失败   

2005-09-27 13:26 by oop80
我来试试看。

# re: 页面postback导致urlrewrite失败   

2005-09-27 14:26 by oop80
还是有问题,我想这不是action的问题,而是我的页面处理流程上的问题。研究。

# re: 页面postback导致urlrewrite失败   

2005-09-27 19:43 by sohu
这里有一篇文章,其中就有你所说的问题。
http://www.cnblogs.com/xspin/articles/30788.aspx

# re: 页面postback导致urlrewrite失败   

2005-09-27 22:49 by 工业酒精

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 &lt;form&gt; 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 );
  }


 }
}

# re: 页面postback导致urlrewrite失败   

2005-09-27 22:50 by 工业酒精
<%@ Register TagPrefix="UrlForm" Namespace="ActionlessForm" Assembly="ActionlessForm" %>


<urlform:form id="formid" runat="server" method="post">
</urlform:form>

# re: 页面postback导致urlrewrite失败   

2005-09-27 22:52 by 工业酒精
Goodspeed 贴的有缺陷。。。。

上面那个一直用,没什么错误
posted on 2005-09-28 00:52  把我的欢乐带给你  阅读(451)  评论(0)    收藏  举报