私も同様の問題に直面しています。ただし、VirtualPathProviderは、このような小さな利益のために実装するにはあまりにも多くの配管が必要です。言うまでもなく、実装するのはセキュリティ面で少しリスクが高い可能性があるようです。私は2つの可能な回避策を見つけました:
1)リフレクションを使用して、必要なものを取得します。
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)ややハッキーな回避策を使用します。
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;
私は、どちらも優れたソリューションではないことを公然と管理しています。理想的には、この種のもののためのメソッドが.NetFrameworkにあるでしょう。何かのようなもの:
public class TemplateParser
{
public static ITemplate ParseTemplate(string content, string virtualPath, bool ignoreParserFilter)
{
return TemplateParser.ParseTemplate(string content, VirtualPath.Create(virtualPath), ignoreParserFilter);
}
}
これにより、VirtualPathProviderを実装する必要性全体が軽減されます。たぶん、ASP.NETvNextでそれを見るでしょう:-)