2011-03-22 5 views
0

웹 응용 프로그램에서 일부 템플릿을 구현하려고하고 ASP.NET의 템플릿 컨트롤을 활용하고 싶습니다. 그러나 실제 .ascx 파일이나 VirtualPathProvider를 사용하여 템플릿을로드하지 않으려합니다.데이터베이스 또는 문자열에서 ITemplate을로드 할 수 있습니까?

데이터베이스 또는 다른 데이터 저장소 (메모리에있는?)에서 템플릿을로드 할 수 있기를 원합니다. .ascx 템플릿의 문자열 표현이 주어진 ITemplate를 반환하는 LoadTemplate() 메서드의 구현이 있습니까?

그렇지 않다면 어떻게 작성하나요?

참고로, Kentico 비슷한 기능을 가지고 있지만, 그들은 TemplateControl 클래스에 LoadTemplate()를 사용하기 위해 VirtualPathProvider에 의존하고 있습니다. 이 방법을 사용하면 데이터베이스에 저장된 템플릿을로드 할 수 있습니다.

+0

제대로 기억한다면 Sitefinity에서도이 점을 보았습니다. 이것이 최선의 방법이라고 생각합니다. 또는 ascx 마크 업을위한 자체 구문 분석기를 만들 수도 있지만 사소한 것은 아닙니다. – Robert

+0

그래, 난 많은 .NET 기반의 CMS 및 기타 확장 가능한 애플 리케이션이 방법을 사용하는 것 같아요. 그것은 사소한 것처럼 보이기 때문에 물리적 인 ASCX 파일과 문자열 변수를 갖는 것이 왜 다른지 알기가 어렵습니다. 내가 여기에 ASP.Net 포럼에서이 요청을 게시 –

답변

1

예, 문자열 또는 데이터베이스를 사용하려면 VirtualPathProvider을 사용하는 것이 좋습니다. (또한 코드를 방출 할 수 코드 생성기가 있지만 동적으로 코드를 작성할 때 보통 사람들이 사용됩니다 -. 귀하의 경우와 같은 외부 소스에서로드되지 않음)

당신은 당신이 돈 언급하지 않는다 ' VirtualPathProvider를 사용하려고합니다. 특정 상황에서 특별한 요구 사항 때문에 원하지 않거나 할 수 없기 때문입니까?

마지막으로, 동적으로 코드를로드하고 컴파일하는 것이 "사소한 것"이라면, 닷넷 시스템이 동적 코드 (어셈블리 생성, 컴파일 및 JIT)를 실행하기 전에해야 할 일이 무엇인지 모릅니다. 응용 프로그램 컨텍스트, 클래스/구성원 이름 확인, 코드 보안 등을 포함 할 수 있습니다. 어쩌면 당신은 방금 .Net이 다른 복잡한 작업을 얼마나 쉽게했는지에 버릇이있을 수 있습니다. ;-)

1

나는 비슷한 문제에 직면했습니다. 그러나 VirtualPathProvider는 이러한 작은 이득을 구현하기에는 배관이 너무 많습니다. 구현하기에 약간 위험 할 수있는 잠재력을 가진 것처럼 보이지는 않습니다.

1) 당신이 원하는 것을 얻을 리플렉션을 사용 :

var page = HttpContext.Current.Handler as Page; 
string text = "<table><tr><td>Testing!!!</td></tr></table>"; 
string modifiedText = string.Format("<asp:UpdatePanel runat=\"server\"><ContentTemplate>{0}</ContentTemplate></asp:UpdatePanel>", text); 
var control = page.ParseControl(modifiedText); 
var updatePanel = control.Controls[0] as UpdatePanel; 
var template = updatePanel.ContentTemplate; 

I :

var page = HttpContext.Current.Handler as Page; 
string text = "<table><tr><td>Testing!!!</td></tr></table>"; 
var systemWebAssembly = System.Reflection.Assembly.GetAssembly(typeof(Page)); 
var virtualPathType = systemWebAssembly.GetTypes().Where(t => t.Name == "VirtualPath").FirstOrDefault(); // Type.GetType("System.Web.VirtualPath"); 
var createMethod = virtualPathType.GetMethods(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public).Where(m => m.Name == "Create" && m.GetParameters().Length == 1).FirstOrDefault(); 
object virtualPath = createMethod.Invoke(null, new object[] 
{ 
    page.AppRelativeVirtualPath 
}); 
var template = (ITemplate)typeof(TemplateParser).GetMethod("ParseTemplate", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic).Invoke(null, new object[]{text, virtualPath, true}); 

2) 다소 해키 해결 방법을 사용하여 나는 두 가지 일 차선책을 발견했습니다 공개적으로 어느 쪽도 좋은 해결책이 아니다. 이상적으로, .NET Framework에는 이러한 종류의 메소드가 있습니다. 예 :

public class TemplateParser 
{ 
    public static ITemplate ParseTemplate(string content, string virtualPath, bool ignoreParserFilter) 
    { 
     return TemplateParser.ParseTemplate(string content, VirtualPath.Create(virtualPath), ignoreParserFilter); 
    } 
} 

이렇게하면 VirtualPathProvider를 구현해야하는 필요성이 줄어 듭니다. 어쩌면 우리는 ASP.NET vNext에서 이것을 볼 것입니다 :-)

+0

그냥 참고 : – mhildreth

+0

http://forums.asp.net/t/1735312.aspx/1?Feature+Request+to+alleviate+need+for+ VirtualPathProvider – mhildreth