解决方法有二:
(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>
(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>
html输出是有顺序的这个需要写在form生成后 而且不能用Server.Transfer通不过验证,用response.redirect
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
<script type="text/javascript">
document.forms[0].action = "";
</script>
</div>
</form>