2011-08-16 5 views
2

UserControl의 코드를 데이터베이스 테이블에 저장하거나 동적으로 컴파일하거나 거기에서로드 할 수있는 방법이 있습니까? 나는 UserControl의 전체 코드를 포함하는 데이터베이스에서 문자열을 얻은 다음 페이지에 추가한다는 의미입니까?Web UserControl ascx와 코드를 데이터베이스에 저장하고 거기에서로드 할 수 있습니까?

+1

내 머리가 녹고있다. –

+0

@pst 왜? 현재 Sharepoint에서 작업 중이며 데이터베이스에서 모든 코드를 가져옵니다. 그래서, 어떻게 든 가능할 것입니다. – teenup

+0

데이터베이스에서 사용자 정의 컨트롤을로드합니다 ...? 나는 그들이 ControlTemplates에 있다고 확신했다 ... –

답변

1

몇 가지 아이디어 :

(대신 컨트롤) 전체 페이지와

    HttpHandler를 가진 임시 파일
  1. 사용 UserControl.LoadControl()와
  2. 사용 UserControl.LoadControl()
  3. 사용 BuildManager.CreateInstanceFromVirtualPath() 옵션 1 : 임시 파일 (가장 쉬운 방법)

    1. 웹 응용 프로그램에 쓸 디렉토리를 만듭니다 (예 : ~/tmp/ (및 웹 응용 프로그램이 & 디렉토리에 대한 권한 생성, 수정 제공) 임시 파일에
    2. 저장 UserControl을 내용 :

      string userControlContents = /* get user control contents from database */; 
      string path = Server.MapPath("~/tmp/2011081612332423.ascx"); 
      System.IO.File.WriteAllText(path, userControlContents); 
      
    3. 로드 사용자 정의 컨트롤 :

      Control c = UserControl.LoadControl("~/tmp/2011081612332423.ascx") 
      
    4. 사용자 정의 컨트롤을 원하는 페이지에 추가하십시오.

      ,691,363,210
      this.Controls.Add(c); 
      

    옵션 2 : HttpHandler를

    1. 이드 의해 해당 UserControl 내용을 가져 와서 Response 스트림
      • 을 데이터베이스에서 원시 콘텐츠를 출력하는 페이지 또는 HttpHandler를 구현 UserControl.LoadControl()이 아마도 Response 스트림에 관심이 없기 때문에 이것은에서 작동하지 않을 수 있습니다.
    2. 그런 다음 옵션 1에서와 같이 컨트롤을로드 :

      Control c = UserControl.LoadControl("~/UserControlFromDB.ascx?id=392") 
      
      • ASP.NET의 JIT 캐싱 파일 이름 때문에 깰 수있는 "UserControlFromDB.ascx은"항상 (만 id=NNN 동일 변경). URL 재 작성이이 문제를 해결할 수 있습니다.

    옵션 3 :

    BuildManager.CreateInstanceFromVirtualPath() 가상 경로에서 ASP.NET에서 Page을 컴파일 : 페이지 대신 컨트롤 컴파일.따라서 전체 페이지을 데이터베이스에 저장하고 동적으로 컴파일 할 수 있습니다.


    면책 조항 : 내가 컨트롤이나 데이터베이스의 페이지를 저장하지 않는 것이 좋습니다; 디버깅 및 보안 비용이 증가합니다.

관련 문제