나는 비슷한 문제에 직면했습니다. 그러나 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에서 이것을 볼 것입니다 :-)
제대로 기억한다면 Sitefinity에서도이 점을 보았습니다. 이것이 최선의 방법이라고 생각합니다. 또는 ascx 마크 업을위한 자체 구문 분석기를 만들 수도 있지만 사소한 것은 아닙니다. – Robert
그래, 난 많은 .NET 기반의 CMS 및 기타 확장 가능한 애플 리케이션이 방법을 사용하는 것 같아요. 그것은 사소한 것처럼 보이기 때문에 물리적 인 ASCX 파일과 문자열 변수를 갖는 것이 왜 다른지 알기가 어렵습니다. 내가 여기에 ASP.Net 포럼에서이 요청을 게시 –