`
pumaboyd
  • 浏览: 248630 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

[转]Asp.NetURL重写后,postback 问题

阅读更多

原文:http://blog.csdn.net/pc01/archive/2006/06/23/824872.aspx

在重写后的
url里如果产生回发,例如有一个按钮,又调用了该被重写的aspx,用户浏览器中将会显示该aspx文件实际的地址,也就是http: //hostname/default.aspx?id=11。但从用户的角度考虑,如 果单击按钮时突然看到 URL 更改会使他们感到不安。因此必须解决这个问题。
解决方法有二:
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>

这种方法应是最简单的,而且也不用改动原来的代码。


 

在重写后的url里如果产生回发,例如有一个按钮,又调用了该被重写的aspx,用户浏览器中将会显示该aspx文件实际的地址,也就是http: //hostname/default.aspx?id=11。但从用户的角度考虑,如 果单击按钮时突然看到 URL 更改会使他们感到不安。因此必须解决这个问题。
解决方法有二:
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>

这种方法应是最简单的,而且也不用改动原来的代码。

分享到:
评论

相关推荐

    基于IIS层的IIRF实现URL重写 + 完美解决POSTBACK问题

    【基于IIS层的IIRF实现URL重写 + 完美解决POSTBACK问题】 1.请在 Windows2003 操作系统环境下测试。 2.请确认您的IIS版本为 IIS6.0+ 。 3.请确认您已经将此项目的ASP.NET网站版本手动设置为 .NET 2.0. 4.请将Bin...

    IIRF_URLRewrite基于IIS层的IIRF实现URL重写+完美解决POSTBACK问题

    通过这个压缩包,开发者可以深入学习如何在IIS环境中配置和使用IIRF,理解URL重写的原理,同时掌握如何在ASP.NET应用中处理POSTBACK问题,进一步提升网站的用户体验和搜索引擎友好性。此外,源码的分析和实践也有助...

    asp.net url重写后页面回传问题

    总结来说,解决***中URL重写后的页面回传问题,主要通过创建自定义页面基类和重写HtmlTextWriter的方法实现,从而保持URL重写的效果在页面回传操作中依然有效。通过修改Web.config配置,使得所有页面都使用这个...

    Url重写篇视频------本讲将通过实例比较ASP.NET下的三种典型URL重写方案

    但是,当试着点击页面中的按钮,我们马上会发现,页面postback后,浏览器地址栏中的链接变成了那个被重写后的地址,而不是,原来显示于地址栏的虚拟地址了。这是一个严重的不一致,没道理我点击页面的按钮,在没有...

    ASP.NET经典问题.

    这个"ASP.NET经典问题"的压缩包文件很可能是包含了开发者在实际开发过程中经常遇到的一些常见问题及其解决方案的集合。以下是一些可能涵盖的知识点: 1. **生命周期管理**:ASP.NET页面和控件具有特定的生命周期,...

    ASP.NET-[其他类别]ASP.NET2.0支持多语言示例源码.zip

    由于View State存储了控件的状态,如果控件的文本是动态从资源文件加载的,那么在PostBack后也需要重新加载相应语言的资源。 6. URL重写与多语言: 为了提供友好的URL并方便SEO,可以结合URL重写技术实现多语言路由...

    ASP同学录ASP.zip

    3. **视图状态(ViewState)**:ASP.NET Web Forms中的视图状态用于在页面间保留控件的状态信息,即使在PostBack(页面回发)过程中也能保持数据。在同学录系统中,视图状态可能用于保持用户在表单中填写的部分信息...

    不错的ASP.NETppt课件

    ASP.NET是微软公司推出的一种基于.NET Framework的服务器端网页开发技术,它允许开发者构建功能丰富的、高性能的Web应用程序。这份“不错的ASP.NET ppt课件”显然是一份详细讲解ASP.NET核心概念和技术的教程资料,...

    Asp.Net 知识库

    10. **部署**:了解如何在IIS(Internet Information Services)上配置和部署Asp.Net应用程序是开发过程中的重要环节,涉及到发布设置、URL重写和配置管理等。 在学习Asp.Net的过程中,除了理解这些核心概念,还...

    海哥通讯录_asp.netC#_

    6. **PostBack机制**:ASP.NET Web Forms中的PostBack机制,允许用户与页面进行交互后,服务器端能够重新处理请求并更新页面内容。 7. **错误处理和调试**:在项目开发中,良好的错误处理和调试技巧是必不可少的,...

    十天学会ASP.NET

    【ASP.NET技术详解】 ASP.NET是由微软公司推出的用于构建Web应用程序的框架,它基于.NET Framework,为开发者提供了高效、安全且可扩展的平台。在这个“十天学会ASP.NET”的教程中,你将深入理解这一强大的Web开发...

    ASP.NET webforms数据库操作基础例程(POSTBACK)

    例程基于ASP.NET webforms框架,采用POSTBACK技术,展现了对数据库相关的各项操作与内容展示,并实现了分页显示。相关数据库请下载本人资源《中国省级区域概况-ASP.NET例程数据库(SQL2008R2)》...

    ASP.NET刷新界面

    在ASP.NET中,刷新界面是指重新加载或更新用户界面(UI)以便显示最新的数据或执行特定操作后的变化。这里我们将详细讨论标题和描述中提及的ASP.NET界面刷新的六种方法,并通过具体的代码示例来解释它们。 1. **...

    asp.net中的按钮失效问题

    在ASP.NET开发中,按钮失效问题是一个常见的挑战,尤其是在页面回发(Postback)和事件处理过程中。本文将深入探讨这个问题,并提供相应的解决方案。 首先,理解ASP.NET按钮失效的常见原因至关重要。通常,按钮失效...

    ASP.NET.完全手册

    6. **页面间通信**:包括查询字符串、URL重写、Session和Application状态,以及如何使用PostBack和Ajax实现异步更新。 7. **MVC框架**:ASP.NET MVC是一个轻量级、模型-视图-控制器架构,我们将会学习其设计模式、...

    ASP.NET.XML C# 高级编程

    3. **ASP.NET核心概念**:生命周期管理、控件事件、视图状态、PostBack机制、路由和URL重写。 4. **ASP.NET Web Forms**:控件体系、数据绑定、用户控件、母版页。 5. **ASP.NET MVC**:模型-视图-控制器架构、路由...

    asp.netNIIT教程实例代码

    4. **视图状态**:ASP.NET使用视图状态来在页面间保留控件的状态,即使在POSTBACK(页面回发)期间也能保持数据。 5. **Web Forms和MVC模式**:ASP.NET有两种主要的开发模型:Web Forms和MVC(Model-View-...

    浅谈ASP.NET的Postback 实例代码第1/2页

    我们现在来看看ASP.NET整个Postback程序处理的过程。 首先我们通过一个Sample来看ASP.NET如何处理一个通过Click一个Button引起的Postback。下面是Web Page的HTML: 代码如下: &lt;&#37;@ Page Language=”C#” ...

    对ASP.NET GridView Image 命令按钮Multiple PostBacks处理技巧程序例子

    在ASP.NET中,PostBack是指用户与页面上的控件交互后,服务器重新加载整个页面的过程。当使用Image按钮(实际上是ImageButton控件)时,每次点击都会触发PostBack,即使我们只想执行一次特定的操作。 问题的核心...

    ASP.NETXIANGMU

    2. **视图状态(ViewState)**:ASP.NET默认使用ViewState来保存页面在多个Postback之间的状态。这使得服务器端控件可以保持其值,但也会增加页面大小。 3. **控件**:ASP.NET提供了大量内置控件,如TextBox、...

Global site tag (gtag.js) - Google Analytics