我们希望能够偶尔换出/替换/覆盖ASPX文件。这就是场景。
我们有一个用ASP.NET编写的门户网站,它已经拥有大量的页面 - 用于查看数据,更新记录,报告等。有些客户“非常重要”,因此我们需要能够为他们自定义某些页面,因此当他们登录时,他们会看到为他们定制的页面。
母版页很棒 - 我们可以自定义页眉,页脚等,但我们可能想要隐藏某些区域,或者完全移动它们。我们不能用Master Pages做到这一点。
主题/皮肤适用于CSS并且使控件的行为有所不同,但这也不允许我完全重新组织特定页面。
所以我希望能够编写代码去“嘿,我作为一个特殊的客户端登录,去找出我正在使用的'覆盖'.aspx页面。如果有的话是,使用它。否则使用已存在的.aspx。“
这意味着我可以在我的服务器上为每个“特殊客户端”创建一个目录,其中包含奇数.aspx文件,覆盖默认值。
我怎样才能做到这一点?
非常感谢 尼克
答案 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或数据库来存储页面某些区域的内容,并在用户访问页面时拉入这些区域。
然后,您可以将页面区域绑定到用户的角色(如果所有内容都在数据库中)。然后,您甚至可以允许特定角色根据需要自定义内容。