C# 使用Global.asax重写和回发URL的另一种方法?

C# 使用Global.asax重写和回发URL的另一种方法?,c#,asp.net,url-rewriting,postback,C#,Asp.net,Url Rewriting,Postback,我在URL重写和回发方面遇到了问题 编辑:当前正在使用IIS 7和URL重写模块 基本上,在回发之后,我的URL重写完全搞砸了,并在查询字符串中添加了一些重复的和不必要的字段值对。考虑到我正在解析代码中的URL,这在引发回发后破坏了一个已经工作的页面 据我所见,我之前的许多人都有相同的问题,几乎所有人都通过在PageLoad上修改表单操作来解决,如下所示: protected void Page_Load(object sender, EventArgs e) { for

我在URL重写和回发方面遇到了问题

编辑:当前正在使用IIS 7和URL重写模块

基本上,在回发之后,我的URL重写完全搞砸了,并在查询字符串中添加了一些重复的和不必要的字段值对。考虑到我正在解析代码中的URL,这在引发回发后破坏了一个已经工作的页面

据我所见,我之前的许多人都有相同的问题,几乎所有人都通过在PageLoad上修改表单操作来解决,如下所示:

protected void Page_Load(object sender, EventArgs e)
    {
        form1.Action = Request.RawUrl;

        //Some other interesting things.
    }
重要提示:这就成功了,它起作用了

然而,尽管我的开发经验实际上不到一个月,但到目前为止,我一直在努力寻找更优雅的解决方案。我已经被暗示,可能有一个更好的选择,包括编辑Global.asax,以便在更“全局”的级别上获得相同的结果

在我看来,这应该会使它总体上更高效,因为在调用任何其他页面之前都会完成这个技巧

所以我的实际问题是:

如何通过编辑Global.asax文件而不是修改母版页加载事件上的表单操作来实现相同的效果?如果你有一个更优雅的解决方案,我会很感激你也包括它


考虑到这是我的第一个问题,我希望我有足够的建设性。

通过iis还有一种方法:

我建议您按如下方式计算根目录(在母版页属性中,如果存在母版):

Root = "http://" + Request.Url.Host + Request.ApplicationPath;
Root += (Root.EndsWith("/") ? "" : "/");
然后使用以下指令将其粘贴到.aspx中:

<%=Root %>

如果您无法更改重写方法,那么我可以想出两种可能比您现有的方法更好的方法

1) 创建一个基页并重写其中的操作-然后所有页面都应从新的基页继承。这样可以将代码保存在一个地方,而不必在每一页中都编写代码

2) 从默认表单控件继承并停止它同时呈现action属性,然后它将回发到重写的URL。然后用新控件替换所有表单实例。你可以在这篇文章的一半左右理解我的意思

编辑


3) Scott Gu发布了一个解决这个问题的方法(在本文中),它更简洁,不需要使用控制适配器来更改任何代码。

您使用的是什么版本的.NET?在3.5及以上版本中,您可以使用MVC的路由引擎,该引擎在路由方面更加优雅+1。如果你关心你的URL,自从你解析它们之后,你似乎就这么做了,你需要路由。目前我正在使用IIS 7和URL重写。据我所知,路由是一个不同的概念,当然不是一个简单的概念,特别是对于初学者。到目前为止,我的简单URL重写工作完美无瑕,我想一次学习一件事。我现在只是想以不同的方式实现回发修复。不过感谢@Kevin和bzlm的支持。我很感激你的建议,当我有时间研究其他技术时,我会考虑到这一点。我将这篇文章添加到书签中,我将查看您提到的MVC路由引擎。您没有注意到我的URL已经被重写了。实际上,它是用IIS完成的,但是回发后返回的URL被弄乱了——这是主要问题。Scott Gu的文章很棒!我会尝试一下他的方法,或者其他一些想法——谢谢。从1开始,母版页就是这样做的,它并没有真正提高效率。从2开始,这是一个聪明的解决方案,但考虑到我是一个新手,我仍然不想搞乱诸如用自定义表单完全替换表单之类的内部事务,除非我对自己正在做的事情有信心。