url重写+Asp.Net登录表单=死亡
-
03-07-2019 - |
题
在我们的网站上,我们进行 URL 重写以生成大量数据库生成的页面。每个页面上都有一个用户登录控件。像这样:
内部aspx页面:/db.aspx?id=123用户可见网址:/ABC/123.aspx、/ABC/456.aspx ...(网址重写)
不幸的是,每个页面上的标记都有一个“DB.aspx?id=123”的操作属性。当用户单击按钮时,浏览器将发布到 /ABC/DB.aspx?id=123 这当然不存在。
我尝试过的解决方案:1.通过子类化 HtmlForm 来更改操作属性。这会破坏网站上的所有其他形式。2.删除 action 属性(以便浏览器始终发布到相同的 url)。这适用于重写的页面,但在“/”(根目录中的default.aspx)上,我收到一条消息,表明“/”上不允许动词帖子(iis 6,我无法控制映射)
有人吗?
解决方案
查看来自 scott gu 的这篇非常好的博客文章, http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx.
具体来说,您可以利用新的 ASP.NET 2.0 控件适配器扩展体系结构来自定义控件的呈现,并使用您提供的值覆盖其“action”属性值。这不需要您更改 .aspx 页面中的任何代码”
检查该部分:“Handling ASP.NET PostBacks with URL Rewriting”,我已经使用了他成功发布的适配器。
诗。请注意,在使用 cookieless 会话时使用 url 重写时,asp.net 上会出现一些问题,并且重写的 url 比原始页面更深,就像您所拥有的那样。(/abc/apage 与/D b?)。问题出在框架的源代码中,有解决方法,但这是一个完整的主题(需要权衡:( ...您可能希望它们处于同一级别)。
其他提示
可能是语义,但是action属性=" DB.aspx?id = 123"或“/DB.aspx?id = 123”?假设您的URL重写允许传递到物理页面,这可能是您的问题。
我从来没有这样做过,但是我看到了使用Reflector的代码,我猜你可以这样解决:
在页面上:
this.Form.Action = null;
或:
this.Form.SetAttribute("action", null);
如果这不起作用,只需设置所需的路径:
this.Form.SetAttribute(" action"," ABC / 123.aspx");
如果升级到ASP.NET 3.5 SP1,请动作属性现在正确识别并且可以从代码隐藏设置。