2011-09-27 41 views
1

对这个问题很新颖,并在枪下拿出一个解决方案。问题是我如何加载同一个ASPX页面的几个版本之一,对于任何给定的页面。例如。未知的请求catalog.aspx的毫无戒心的用户,我实际上服务catalog_1.aspx,catalog_2.aspx或catalog_3.aspx等之一。ASP.NET - 如何透明地更改请求的页面名称?

确实奇怪的要求。这是由于一个遗留的十年陈旧的产品在ASPX上有内联样式。我试图用正则表达式替换它们以获得适合各种屏幕尺寸的版本,而不是重新编写数百个ASPX。然后,我会在用户登录后测量窗口大小并选择最好的一个(并可能将大小存储在cookie中)。

我认为这将涉及一些像http处理程序一样的较低级别的对象。关?

LJ

更新:我最终通过URL重写其效果要好得多这样做。在asp.net中最简单的做法是显示global.asax和Application_BeginRequest事件。调用context.RewritePath(newpath,False)将请求发送到与请求不同的页面。

以我这样做的方式,如果回发的收件人不是生成视图状态的页面的确切版本,则目标页面可能会从请求更改为请求,并且显然会扰乱回发。我试图关闭视图状态验证,但没有帮助。因此,必须防止在用户登录后在版本之间翻转。希望这可以帮助某人。

回答

0

Server.Transfer可能是最简单的方法。

string TransferTo = string.Empty; 

if(Something) 
    TransferTo = "catalog_1.aspx"; 
else if(SomethingElse) 
    TransferTo = "catalog_2.aspx"; 
else 
    TransferTo = "catalog_3.aspx"; 

Server.Transfer(TransferTo, false); 

Documentation

注意 如果随后的页面有回传控制,他们将揭示该页面在该点的真实URL。如果这很重要,那么这种方法将无法工作。

+0

我想你会遇到问题,如果有这些页面回发控件。表单上的操作将是'catalog_1.aspx',所以在发布之后,我相信URL栏将显示'catalog_1.aspx',而不是'catalog.aspx',除非您在响应中做了更多的调整。 –

+0

你是对的,它会表现得那样。他们没有说明,所以我只是寻找最快的选择。加载页面后不知道这个问题。 –

+0

供参考:不是OP,所以我不知道这是否会成为他们的问题... –

0

我不喜欢这种方法,但也许你可以使用全窗口的IFRAME来保存合适的页面 - catalog.aspx只不过是一个大框架,你可以在代码隐藏中设置该框架的来源。

+0

谢谢,乔。我简单地想到了这一点,但问题是页面内的所有链接仍然会指向未加后缀的页面名称。我认为这需要成为服务器端技巧。 – user788364