URL重写后,在有页面回发时的处理
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                URL重写后,在有页面回发时的处理
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            在重寫后的url里如果產(chǎn)生回發(fā),例如有一個按鈕,又調(diào)用了該被重寫的aspx,用戶瀏覽器中將會顯示該aspx文件實際的地址,也就是http:?//hostname/default.aspx?id=11。但從用戶的角度考慮,如?果單擊按鈕時突然看到?URL?更改會使他們感到不安。因此必須解決這個問題。 
解決方法有二:
(1)自己定義一個Actionlessform類,在aspx中不再使用系統(tǒng)提供的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); } } }
創(chuàng)建此類并對其進行編譯之后,要在?ASP.NET?Web?應(yīng)用程序中使用它,應(yīng)首先將其添加到?Web?應(yīng)用程序的?References?文件夾中。然后,要?使用它來代替?HtmlForm?類,做法是在?ASP.NET?網(wǎng)頁的頂部添加以下內(nèi)容:
<%@ Register TagPrefix="skm" Namespace="ActionlessForm" Assembly="ActionlessForm" %>
然后,將
<form runat="server">
(如果有)替換為:
<skm:Form id="Form1" method="post" runat="server">
并將右邊的?</form>?標記替換為:
</skm: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文件對應(yīng)的cs文件中的繼承page類的代碼改寫為繼承OLPage。
例如
public?class?WebForm1:page
改寫為
public?class?WebForm1:URL.OLPage
(3)通過客戶端代碼清除form的action。
對于ASPX頁面,我們在客戶端查看代碼時會發(fā)現(xiàn),它自動為form加入了action,并且地址就是開頭所說的原始頁面地址。而對于ASPX頁面,若當它的action為空時也就將回發(fā)到當前地址。這樣我們就可以通過在客戶端清除action的方法,來實現(xiàn)回發(fā)后繼續(xù)保持有地址。
在頁面中加入以下代碼即可:
<script type="text/javascript"> try{document.forms[0].action=""}catch(ex){} </script> html輸出是有順序的這個需要寫在form生成后
                        
                        
                        解決方法有二:
(1)自己定義一個Actionlessform類,在aspx中不再使用系統(tǒng)提供的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); } } }
創(chuàng)建此類并對其進行編譯之后,要在?ASP.NET?Web?應(yīng)用程序中使用它,應(yīng)首先將其添加到?Web?應(yīng)用程序的?References?文件夾中。然后,要?使用它來代替?HtmlForm?類,做法是在?ASP.NET?網(wǎng)頁的頂部添加以下內(nèi)容:
<%@ Register TagPrefix="skm" Namespace="ActionlessForm" Assembly="ActionlessForm" %>
然后,將
<form runat="server">
(如果有)替換為:
<skm:Form id="Form1" method="post" runat="server">
并將右邊的?</form>?標記替換為:
</skm: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文件對應(yīng)的cs文件中的繼承page類的代碼改寫為繼承OLPage。
例如
public?class?WebForm1:page
改寫為
public?class?WebForm1:URL.OLPage
(3)通過客戶端代碼清除form的action。
對于ASPX頁面,我們在客戶端查看代碼時會發(fā)現(xiàn),它自動為form加入了action,并且地址就是開頭所說的原始頁面地址。而對于ASPX頁面,若當它的action為空時也就將回發(fā)到當前地址。這樣我們就可以通過在客戶端清除action的方法,來實現(xiàn)回發(fā)后繼續(xù)保持有地址。
在頁面中加入以下代碼即可:
<script type="text/javascript"> try{document.forms[0].action=""}catch(ex){} </script> html輸出是有順序的這個需要寫在form生成后
轉(zhuǎn)載于:https://www.cnblogs.com/cuihongyu3503319/archive/2009/02/18/1393388.html
總結(jié)
以上是生活随笔為你收集整理的URL重写后,在有页面回发时的处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: ASP.NET中Server与Reque
- 下一篇: XAML概要--事件和后台代码
