Frage

Ich möchte einige Vorlagen in einer Webanwendung implementieren und wollte die Vorlagensteuerelemente von ASP.NET verwenden.Ich möchte mich jedoch nicht auf physische .ascx-Dateien oder den VirtualPathProvider verlassen, um die Vorlagen zu laden.

Ich möchte die Vorlagen aus einer Datenbank oder einem anderen Datenspeicher (im Speicher?) laden können. Gibt es eine Implementierung einer LoadTemplate () -Methode, die eine ITemplate bei einer Zeichenfolgendarstellung einer .ascx-Vorlage zurückgibt?

Wenn nicht, wie würde ich vorgehen, um eine zu schreiben?

Zu Ihrer Information, Kentico hat eine ähnliche Funktion, aber sie stützen sich auf den VirtualPathProvider, um den LoadTemplate() für die TemplateControl-Klasse zu verwenden.Mit dieser Methode können sie in der Datenbank gespeicherte Vorlagen (sie nennen sie Transformationen) laden.

War es hilfreich?

Lösung

Ja, VirtualPathProvider ist wahrscheinlich die Methode, die Sie verwenden möchten, wenn eine Zeichenfolge oder Datenbank die Quelle ist, die Sie verwenden möchten.(Es gibt auch Codegeneratoren, die Code ausgeben können, aber normalerweise werden diese verwendet, wenn der Code dynamisch erstellt wird - nicht wie in Ihrem Fall aus einer externen Quelle geladen.)

Sie erwähnen nicht, warum Sie den VirtualPathProvider nicht verwenden möchten.Liegt es daran, dass Sie dies nicht möchten oder können, weil Sie in einer bestimmten Situation besondere Anforderungen haben?

Wenn es "trivial" erscheint, Code dynamisch zu laden und zu kompilieren, wissen Sie nicht, was das gesamte .Net-System tun muss, bevor es dynamischen Code ausführen kann - Assembly-Generierung, Kompilierung und JIT-AnwendungKontexte, Auflösung von Klassen- / Mitgliedsnamen, Codesicherheit usw. Vielleicht wurden Sie gerade damit verwöhnt, wie einfach .Net es gemacht hat, andere komplizierte Aufgaben zu erledigen.;-)

Andere Tipps

Ich hatte ein ähnliches Problem.Der VirtualPathProvider ist jedoch einfach zu aufwändig, um ihn für einen so geringen Gewinn zu implementieren - ganz zu schweigen davon, dass die Implementierung in Bezug auf die Sicherheit möglicherweise etwas riskant ist.Ich habe zwei mögliche Problemumgehungen gefunden:

1) Verwenden Sie Reflexion, um zu dem zu gelangen, was Sie wollen:

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) Verwenden Sie eine etwas hackige Umgehung:

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;

Ich sage offen, dass beides keine großartige Lösung ist.Idealerweise gibt es im .Net Framework eine Methode für diese Art von Dingen.So etwas wie:

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

Dies würde die Notwendigkeit der Implementierung des VirtualPathProvider verringern.Vielleicht sehen wir das in ASP.NET vNext :-)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top