是否可以动态加载 .aspx 页面?

Is it possible to dynamically load an .aspx page?

我今天接到一个新需求:对于我们的产品页面,他们希望根据产品类型使用完全不同的布局。

比如说我们卖水桶。目前,所有存储桶都使用完全相同的页面布局。但是现在,他们希望木桶使用当前的布局,而塑料桶使用完全不同的布局。但是,他们希望 URLs 保持不变(例如域。com/bucket/1),所以我不能只将塑料桶转发到新页面。

当前页面结构如下:

CurrentMasterPage.master > CurrentProductPage.aspx > Several UserControls

新布局需要新页面(即重复使用当前页面中的 none):

NewMasterPage.master > NewProductPage.aspx > Several UserControls

我的第一个想法是从 CurrentProductPage.aspx 获取所有标记和代码并将其放入 UserControl,然后为新布局 (NewProductPage.aspx) 创建第二个 UserControl,并让 CurrentProductPage.aspx 根据产品类型动态加载适当的 UserControl,但是,这不起作用,因为新布局需要新的 MasterPage,而我无法从 UserControl 引用 MasterPage。

然后,我想过用URL重写,但是我觉得不可能有相同的URL加载两个不同的页面。

有什么办法可以做到吗?

为什么不使用 100% 服务器端重定向?

当您使用 response.Redirect(“一些不同的页面”)时。然后客户端浏览器发送该页面的全新副本,URL 将被更新。

但是,服务器端可以写任何它想写的页面。客户端甚至不知道服务器决定为给定的 URL.

抛出一个不同的页面

因此,您可以创建一个包含假选项卡作为按钮的页面。当用户点击一个按钮时,浏览器往返开始(对于给定的 URL)。但是在服务器端,您可以为 URL.

提供一个不同的页面

所以,代替这个经典的“往返”,您可以使用:

Server.TransferRequest("MyotherWebPage")

因此,对于给定的 URL,在当前页面(基于给定的 URL)被发送回浏览器之前,上面的代码将简单地抽出一个不同的页面。当前页面永远不会返回到浏览器。

事实上,对于包含大量按钮和功能的丰富页面,您可以更改显示的页面。所以在加载中——简单地代替“response.Redirect”,使用server.Transfer。当前页面永远不会到达客户端 - 你抛出的那个页面。因为客户端对 Web 服务器决定发送什么内容一无所知 - 它也对将不同的页面发送回客户端一无所知。

用测试页试试上面的方法。

页面A,标准按钮后,跳转到网页B

例如:

Response.Recdirect("MyPageB.aspx")

注意 URL 变化 - 经典往返。

现在,使用按钮执行此操作:

Server.Redirect("MyPageB.aspx")

在这种情况下,不会发生完整的往返行程。服务器直接转移到新页面并将其发送出去。 (注意你的 URL 没有改变)。

您可以在 PreInit 页面上使用母版更改母版页。这是可能的,因为主控件与用户控件基本相同,并且在页面代码隐藏之后加载。

protected void Page_PreInit(object sender, EventArgs e)
{
    if (NewProductPage)
    {
        MasterPageFile = "~/NewMasterPage.master";
    }
}