2012-05-16 3 views
3

때때로 ASPX 파일을 스왑 아웃/대체/덮어 쓸 수 있기를 원합니다. 이 시나리오입니다.ASPX 파일 대체

우리는 이미 데이터를보고, 레코드, 보고서 등을 업데이트하기 위해 많은 수의 페이지가있는 ASP.NET으로 작성된 포털을 보유하고 있습니다. 일부 클라이언트는 "정말로 중요합니다"따라서 우리는 특정 페이지를 사용자 정의 할 수 있어야하므로 로그인 할 때 사용자를 위해 사용자 정의 된 페이지가 표시됩니다.

마스터 페이지는 훌륭합니다. 머리글과 바닥 글을 사용자 정의 할 수 있지만 특정 영역을 숨기거나 완전히 이동할 수 있습니다. 마스터 페이지에서는 그렇게 할 수 없습니다.

테마/스킨은 CSS에 적합하고 컨트롤이 다르게 동작하지만 다시 한번 특정 페이지를 완전히 재구성 할 수 없습니다.

그래서 "안녕하세요, 특수 클라이언트로 로그인했습니다. 현재 사용중인 'override'.aspx 페이지가 있는지 알아보십시오. If If 이미 사용중인 .aspx를 사용하십시오. "

즉, 내 "특별 클라이언트"마다 기수가있는 .aspx 파일이있는 디렉터리를 기본 서버보다 우선 할 수 있습니다.

어떻게하면됩니까? 닉

답변

3

이 작업을 수행하려면

많은 감사합니다, 당신은 .aspx 파일을 처리하는 페이지 공장을 등록해야합니다.

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> 
+0

화려한 - 작동했습니다. 첫 번째 httphandler 등록을 변경하여 "name"속성을 제거하고 네임 스페이스를 type 속성에 추가해야했습니다. 또한 "httpContext.Server.MapPath (virtualPath);를 입력하십시오. - "httpContext.Server.MapPath (newVirtualPath);"여야합니다. – nickthompson

+0

다행이었습니다. 의견을 보내 주셔서 감사 드리며 답변을 수정했습니다. –

1

나는 그래서 일단 PageHandlerFactory를 확장하는 새로운 클래스를 생성 특정 정보를 표시 할 클라이언트 유형을 식별하는 메커니즘이 데이터베이스에 있다고 가정하십시오.

어느 쪽이든 나에게 그것은 CMS와 비슷한 기능을 제공하는 것입니다. 사용자의 유형 등에서 콘텐츠를 전문화 할 수있는 곳입니다. 페이지를 덮어 쓰지 않고 교체하는 것이 좋습니다. 가능한 지나치게 복잡하게 만들 수도 있지만 XML 또는 데이터베이스를 사용하여 페이지의 특정 영역에 대한 컨텐트를 저장하고 사용자가 페이지에 액세스 할 때 해당 영역을 끌어 올 수 있습니다.

그런 다음 페이지의 영역을 사용자의 역할에 연결할 수 있습니다 (모든 것이 데이터베이스에있는 경우). 그런 다음 필요한 경우 특정 역할을 허용하여 콘텐츠를 사용자 정의 할 수도 있습니다.