替换ASPX文件

时间:2012-05-16 17:39:35

标签: asp.net user-interface override

我们希望能够偶尔换出/替换/覆盖ASPX文件。这就是场景。

我们有一个用ASP.NET编写的门户网站,它已经拥有大量的页面 - 用于查看数据,更新记录,报告等。有些客户“非常重要”,因此我们需要能够为他们自定义某些页面,因此当他们登录时,他们会看到为他们定制的页面。

母版页很棒 - 我们可以自定义页眉,页脚等,但我们可能想要隐藏某些区域,或者完全移动它们。我们不能用Master Pages做到这一点。

主题/皮肤适用于CSS并且使控件的行为有所不同,但这也不允许我完全重新组织特定页面。

所以我希望能够编写代码去“嘿,我作为一个特殊的客户端登录,去找出我正在使用的'覆盖'.aspx页面。如果有的话是,使用它。否则使用已存在的.aspx。“

这意味着我可以在我的服务器上为每个“特殊客户端”创建一个目录,其中包含奇数.aspx文件,覆盖默认值。

我怎样才能做到这一点?

非常感谢 尼克

2 个答案:

答案 0 :(得分:3)

为此,您需要注册处理.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.webServer>
    <httpHandlers>
        <add verb="*" path="*.aspx" type="MyPageFactory" />
    </httpHandlers>
</system.webServer>

或&lt; IIS7:

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

答案 1 :(得分:1)

我假设用于识别客户端类型以显示某些信息的机制在数据库中?

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

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