3

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

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

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

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

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

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

我怎样才能做到这一点?

非常感谢尼克

4

2 回答 2

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>

或 < IIS7:

<system.web>
    <httpHandlers>
        <add verb="*" path="*.aspx" type="MyPageFactory" />
    </httpHandlers>
</sysetm.web>
于 2012-05-16T17:58:54.383 回答
1

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

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

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

于 2012-05-16T18:18:19.193 回答