Asp.net 替换ASPX文件

Asp.net 替换ASPX文件,asp.net,user-interface,overriding,Asp.net,User Interface,Overriding,我们希望能够偶尔交换/替换/覆盖ASPX文件。情况就是这样 我们有一个用ASP.NET编写的门户,它已经有很多页面了——用于查看数据、更新记录、报告等。有些客户是“非常重要的”,因此我们需要能够为他们定制某些页面,所以当他们登录时,他们会看到为他们定制的页面 母版页很好-我们可以自定义页眉、页脚等,但我们可能希望隐藏某些区域,或者完全移动它们。我们不能用母版页这样做 主题/皮肤有利于CSS和使控件表现不同,但这同样不允许我完全重新组织特定页面 因此,我希望能够编写代码,以便“嘿,我是作为特殊客户

我们希望能够偶尔交换/替换/覆盖ASPX文件。情况就是这样

我们有一个用ASP.NET编写的门户,它已经有很多页面了——用于查看数据、更新记录、报告等。有些客户是“非常重要的”,因此我们需要能够为他们定制某些页面,所以当他们登录时,他们会看到为他们定制的页面

母版页很好-我们可以自定义页眉、页脚等,但我们可能希望隐藏某些区域,或者完全移动它们。我们不能用母版页这样做

主题/皮肤有利于CSS和使控件表现不同,但这同样不允许我完全重新组织特定页面

因此,我希望能够编写代码,以便“嘿,我是作为特殊客户机登录的,去看看我所在的页面是否有‘覆盖’.aspx页面。如果有,请使用该页面。否则,请使用已经存在的.aspx页面。”

这意味着我可以在服务器上为我的每个“特殊客户机”设置一个目录,其中的odd.aspx文件覆盖默认值

我怎样才能做到这一点

非常感谢
Nick

要执行此操作,您需要注册一个处理
.aspx
文件的页面工厂。因此,首先创建一个扩展
PageHandlerFactory
的新类:

public class MyPageFactory : PageHandlerFactory
{
    public override IHttpHandler GetHandler(
        HttpContext httpContext, string requestType, string url, 
        string pathTranslated)
    {
        // Here you can inspect `HttpContext` and perform whatever checks you
        // need to determine whether or not to use your custom overridden page.
        if (shouldOverride) 
        {
            var newVirtualPath = "/Overrides/Foo/MyPage.aspx";
            string newFilePath = httpContext.Server.MapPath(newVirtualPath);

            // Now create the page instance
            IHttpHandler page = PageParser.GetCompiledPageInstance(newVirtualPath, newFilePath, httpContext);
            return page;
        }
        else 
        {
            // If we're not overriding, just return the default implementation
            return base.GetHandler(httpContext, requestType, url, pathTranslated);
        }
    }
}
别忘了在
web.config
(IIs7)中注册它:


<system.web>
    <httpHandlers>
        <add verb="*" path="*.aspx" type="MyPageFactory" />
    </httpHandlers>
</sysetm.web>

我假设有一种机制可以识别要在数据库中显示特定信息的客户端类型

无论哪种方式,对我来说,你所说的似乎是提供一些类似CMS的功能,你可以根据用户类型等专门化内容,而不是覆盖页面并将其替换掉,这是可能的,但可能会使其过于复杂,使用XML或数据库存储页面某些区域的内容,并在用户访问页面时拉入这些区域


然后,您可以将页面的区域与用户的角色绑定(如果所有内容都在数据库中)。然后,如果需要,您甚至可以允许特定角色自定义内容。

Brilliant-它奏效了。必须更改第一个httphandler注册以删除“name”属性,并将名称空间添加到type属性中。“httpContext.Server.MapPath(virtualPath);”中的输入错误也应该是“httpContext.Server.MapPath(newVirtualPath);”很高兴它能工作。谢谢你的评论,修正了答案。
<system.web>
    <httpHandlers>
        <add verb="*" path="*.aspx" type="MyPageFactory" />
    </httpHandlers>
</sysetm.web>