Laden...

Dokument mit C# und HTML

Erstellt von DerPeter123 vor 3 Jahren Letzter Beitrag vor 2 Jahren 2.591 Views
D
DerPeter123 Themenstarter:in
22 Beiträge seit 2021
vor 3 Jahren
Dokument mit C# und HTML

Hallo 🙂

Ich versuche aktuell HTML Dokumente mit C# zu erzeugen. Mein Problem ist dabei, dass ich noch auf der suche nach einer für mich gut geeigneten HTML Template Engine bin.
Über den C# code genieriere ich mir eine Liste mit Objekten einer Klasse. In dieser Klasse speichere ich mir die Werte die ich im HTML Dokument anzeigen möchte. Dabei können es jedes mal beim erzeugen des Dokumentes verschiedene Anzahlen an Objekten und die Objekte können hierachisch untereinander angeordnet sein. Ein Beispiel für eine solche Liste wäre: [Automarke, VW, Porsche, Tesla, Motorradmarke, BMW, Ducati, Kawasaki] (in der liste sollen das Objekte sein die dann immer noch weitere angaben besitzen wie Preis etc.

Das HTML dokumeent soll dann so aufgebaut sein:
Alle infos zum Objekt Automarke

  • Alle Infors zum Objekt VW
  • Alle Infors zum Objekt Porsche
  • Alle Infors zum Objekt Tesla

Alle infos zum Objekt Motorradmarke

  • Alle Infors zum Objekt BMW
  • Alle Infors zum Objekt Ducati
  • Alle Infors zum Objekt Kawasaki

Also wie eine Hierarchie. Mein 2. HTML Dokument könnten dann vlt noch Fahrradmarken mit drin stehen und 5 Automarken oder ähnliches.
Zusätzlich soll es möglich sein ein Logo oder so in dem Dokument anzeigen zu können, damit es etwas sdchöner aussieht. Also CSS würde ich auch gerne nutzen denke ich.
Ich hoffe man versteht wie ich das meine 😁

Eine möglichkeit wäre natürlich den HTML Code in einem String zu speichern, ist aber glaube ich eher unschön. (Und Css dann vlt nicht möglich?)
Hat jemand eine Idee was man für sowas nutzen kann? Razor sah mir ein bisschen zu kompliziert dafür aus und ich bin mir nichtmal sicher ob ich das dafür verwenden kann.
Die andere Option die ich gefunden habe war Handlebars aber das sah so aus das wäre es vor allem mit JavaScript gut und nicht unbedingt mit C#.

Ich hoffe mir kann jemand weiterhelfen, eine gute Hilfe für das Templating empfehlen und vlt auch ein paar Vorteile nennen, die ich gegenüber eines einfachen strings habe.

T
2.219 Beiträge seit 2008
vor 3 Jahren

Wie sieht den deine Anforderung genau aus?
Willst du hier eine Webseite entwickeln mit dynamischen Daten z.B. aus deiner Datenbank?
Dann solltest du dir anschauen, wie man mit C# und .NET Webseiten entwickelt.

Wenn die Informationen komplett statisch sind, reicht es einmalig Html Dateien zu erzeugen und auf einem einfachen Webserver abzulegen.
Hier müsstest du deine Anforderungen bzw. dein eigentliches Ziel mal genauer erläutern.
Html Dateien kannst du sonst auch simpel mit einem Editor zusammen bauen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.806 Beiträge seit 2008
vor 3 Jahren

Ich versuche aktuell HTML Dokumente mit C# zu erzeugen. Mein Problem ist dabei, dass ich noch auf der suche nach einer für mich gut geeigneten HTML Template Engine bin.

Die Standard Engine von ASP.NET nennt sich Razor. Wir generieren auf dieser Engine zum einen den HTML Code des Forums (als Teil der ASP.NET Render Pipeline) und zum anderen auch den HTML-Code der E-Mails (ohne ASP).
Dazu braucht man auch kein extra NuGet Paket mehr, nur noch IRazorViewEngine Interface (Microsoft.AspNetCore.Mvc.Razor)

Ansonsten gibts statische Code Generatoren wie https://wyam.io/

D
DerPeter123 Themenstarter:in
22 Beiträge seit 2021
vor 3 Jahren

Danke schonmal für die Antworten. Es hat nichts mit einem Webserver zutun. Es sollen HTML Dokumente erzeugt werden die in einem lokalen File abgelegt werden und im Browser angezeigt werden können. Mein Problem bissher ist nur das ich nichts gefunden habe oder nicht gefunden habe wie es geht, mit den Template engines die Liste die ich habe mit einer Schleife zu durchlaufen und für jeden Eintrag in der Liste HTML Code mit den Informationen aus dem Objekt der Liste zu erzeugen.
Also ich dachte mir, dass ich vlt ein HTML file erstelle mit Header und Body und so generelle sachen, und im Body bereich vlt mit irgeneiner Biblothek oder so angeben kann das ich an der Stelle etwas einfügen möchte. Und dann durchlaufe ich in meiner C# Methode die Liste und erzeuge dort auch den HTML Code (das wäre dann nur noch <h1>Tesla</h1><p>Kostet 50.000 Eurp</p>). Und diesen kann ich dann in das HTML File einfügen.

Die andere Idee wäre ich mache:


           StringBuilder sb = new StringBuilder();
            sb.Append("<head></head>");
            sb.Append("<body>");
            foreach (var liste in array)
            {
                sb.Append("<p>liste.beschreibung</p>" + "<br>");
            }
            sb.Append("</body>");

            var htmlCode = sb.ToString();
            File.WriteAllText(@"C:\Files\Marken.htm", htmlCode);

Wenn ich das so mache, kann ich aber vermutlich kein Css nutzen?

Ich hoffe mein "Problem" ist jetzt etwas verständlicher.

PS: Razor etc. habe ich für mich als etwas übertrieben angesehen, weil ich ja nur ein HTML file brauche das grundsätzlich immer gleich ist, nur eben durch den Inhalt der Liste, der unterschiedlich sein kann, sich unterschiedet. Und evtl. verschiedene im Header oder so (aber das ist eher neben sache)

D
DerPeter123 Themenstarter:in
22 Beiträge seit 2021
vor 3 Jahren

PPS: Eventuell ist mein Thema auch im bereich "Webtechnologien" falsch, aber ich dachte ich wäre hier richtig, weil HTML ja eine Webtechnolgie ist ^^

16.806 Beiträge seit 2008
vor 3 Jahren

Wie ich in meinem Beitrag geschrieben hab ist weder die RazorEngine Web-only noch der statische Code-Generator.
Du baust nun halt mit dem Stringbuider auch nichts anderes als einen statischen Code-Generator; halt von Grund auf neu und ohne Features.
Klar, kannst so machen: einfaches String Replacement - kein Templating.

Aber Deine Frage war ja, was es es an Generatoren gibt.

Wenn ich das so mache, kann ich aber vermutlich kein Css nutzen?

CSS kannst Du immer nutzen, wenn der Client das zusammen mit HTML versteht.
Mit dem Generieren hat das nichts zutun.

D
DerPeter123 Themenstarter:in
22 Beiträge seit 2021
vor 3 Jahren

ok das heißt auch mit Razor kann ich mir ein HTML File erzeugen und das als HTML Dokument local speichern?

https://wyam.io/ wurde glaube ich in Statiq - Your Imagination, Your Generator umgenannt wenn ich das richtig sehe. und Statiq - Your Imagination, Your Generator scheint leider nicht Kommerziell nutrzbar.
Eigentlich hätte ich gerne etwas was open source ist und für alles mögliche verwendet werden kann. d.h. es bleibt nur noch Razor übrig.
Dann werde ich nochmal nach Razor Tutorials gucken. Hatte bisher nur welche gefunden zum erstellen von Websites.

Letzte Frage: Lohnt es sich bzw. ist es viel aufwand sich Razor anzueignen für meinen Anwendungszweck, wenn man noch nie etwas mit HTML / CSS und Razor gemacht hat?
Vielen Danke aufjedenfall schonmal 🙂

16.806 Beiträge seit 2008
vor 3 Jahren

Nur weil es Open Source ist darfst noch lange nicht alles damit machen.
Das kommt auf die Lizenz an.

Statiq Framework ist MIT lizenziert; also kommerziell verwendbar.

Razor ist nur eine Templatingsprache.
Und irgendeine musst lernen, wenn Du Templating verwenden willst.

D
DerPeter123 Themenstarter:in
22 Beiträge seit 2021
vor 3 Jahren

Ok wenn ich das mit Razor richtig verstanden habe, erstelle ich ein cshtml file und schreibe mit der @ Notation meinen Code, also in meinem Fall die Schleife für die Liste?
Wie bekomme ich denn dann meine Liste in das cshtml file?

Hast du vlt ein Tutorial oder Beispiel wo etwas ähnliches gemacht wird wie bei mir?

F
10.010 Beiträge seit 2004
vor 3 Jahren

Dafür ist toddams/RazorLight geeignet.
Gibt auch genug Beispiele wie man das benutzen kann.

16.806 Beiträge seit 2008
vor 3 Jahren

RazorLight braucht man nicht mehr; man braucht wie gesagt nur noch die Engine.
Kann man natürlich trotzdem verwenden, wenn man will.

Erster Google Treffer: ASP.NET Core MVC Render View to String


public class ViewRendererService : IViewRendererService
{
    private readonly IRazorViewEngine _razorViewEngine;
    private readonly ITempDataProvider _tempDataProvider;
    private readonly IActionContextAccessor _actionContextAccessor;

    public ViewRendererService(IRazorViewEngine razorViewEngine,
        ITempDataProvider tempDataProvider,
        IActionContextAccessor actionContextAccessor)
    {
        _razorViewEngine = razorViewEngine;
        _tempDataProvider = tempDataProvider;
        _actionContextAccessor = actionContextAccessor;
    }


    public async Task<string> RenderViewToStringAsync(object model)
    {
        var actionName = _actionContextAccessor.ActionContext.ActionDescriptor.RouteValues["action"];
        return await RenderViewToStringAsync(actionName, model);
    }

    public async Task<string> RenderViewToStringAsync(string viewPath, object model)
    {
        var actionContext = _actionContextAccessor.ActionContext;
        var viewEngineResult = _razorViewEngine.FindView(actionContext, viewPath, false);

        if (viewEngineResult.View == null || (!viewEngineResult.Success))
        {
            throw new ArgumentNullException($"Unable to find view '{viewPath}'");
        }

        var view = viewEngineResult.View;
        var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), actionContext.ModelState);
        viewDictionary.Model = model;
        var tempData = new TempDataDictionary(actionContext.HttpContext, 
            _tempDataProvider);

        using (var sw = new StringWriter())
        {
            var viewContext = new ViewContext(actionContext, view, viewDictionary, tempData, sw, new HtmlHelperOptions());
            await view.RenderAsync(viewContext);
            return sw.ToString();
        }
    }
}

Wir verwenden das in sehr ähnlicher Form.

F
10.010 Beiträge seit 2004
vor 3 Jahren

Und das kann man so in einer Desktop App ( Forms / WPF ) benutzen?

16.806 Beiträge seit 2008
vor 3 Jahren

Ja, nicht so bequem wie RazorLight; aber wenn Du keine Drittabhängigkeiten willst, dann geht das.

D
152 Beiträge seit 2013
vor 3 Jahren

Wir verwenden für HTML E-Mails scriban. Ist zwar eine andere Syntax als Razor, aber ggf. einfacher.

D
DerPeter123 Themenstarter:in
22 Beiträge seit 2021
vor 3 Jahren

Also Scriban klingt erstmal sehr verständlich aber ich habe noch nicht den Vorteil dazu gefunden, als wenn ich einfach HTML code in einem normalen String speichere. Also es ist etwas einheitlicher in HTML Code und nicht so sehr C# mit HTML vermischt?

Also der Methode "RenderViewToStringAsync" gebe ich den Pfad des HTML files als Parameter mit und dann wird das zu String gerendert?
Und im HTML file kann ich dann über die Razor Syntax mein Document erstellen. Aber wie bekomme ich z.B. die Liste mit den Werten die ich im HTML Document anzeigen möchte, in das HTML file?

16.806 Beiträge seit 2008
vor 3 Jahren

Aber wie bekomme ich z.B. die Liste mit den Werten die ich im HTML Document anzeigen möchte, in das HTML file?

Also wenn Du Templating verwenden willst, dann musst Dir halt auch den jeweiligen Syntax anschauen.
Im Falle von Razor übergibt man den Views entsprechend Modelle, die den Inhalt haben, der in das HTML eingebettet werden soll.
Razor ist extrem gut dokumentiert, zB. als Teil der Razor Pages: Teil 2: Hinzufügen eines Modells

Also es ist etwas einheitlicher in HTML Code und nicht so sehr C# mit HTML vermischt?

Es ist ein Templating-Framework; also das, wonach Du gefragt hast.

aber ich habe noch nicht den Vorteil dazu gefunden, als wenn ich einfach HTML code in einem normalen String speichere.

Das ist kein Templating Framework. Das ist halt String-Replace.

D
DerPeter123 Themenstarter:in
22 Beiträge seit 2021
vor 3 Jahren

Hallo nochmal 🙂

Inzwischen habe ich ein bisschen mit Razor Pages in einer Webapplication herumgetestet.
Allerdings würde ich gerne Razor Pages in einer Consolen App nutzen. Ich habe dazu eine .cshtml und eine .cshtml.cs datei erstellt und es stößt auch erstmal auf keine fehler.
Was mich aber wundert, ist z.B. das bei der Webapp in der Startup von Anfang an AddRazorPages zum service hinzugefügt wird. Ist sowas in der Consolen App auch notwendig oder reicht es eine .cshtml und eine .cshtml.cs datei zuerstellen? Anschließend würde ich das .cshtml file gerne zu einem String rendern. Dazu habe ich auch schon eine Bibliothek gefunden.
Diese: https://github.com/soundaranbu/RazorTemplating
Gibt es da vlt auch noch bessere Möglichkeiten?

Viele Grüße

P
441 Beiträge seit 2014
vor 3 Jahren

Fun Fact: Eine ASP.NET Core / 5 Anwendung ist auch eine Konsolenapplikation 🙂

Schau mal, was Abt oben geschrieben hat. Mit den Infos solltest du problemlos jede Menge Anleitungen finden, wie das in einer Console ohne ASP funktioniert

Die Standard Engine von ASP.NET nennt sich Razor. Wir generieren auf dieser Engine zum einen den HTML Code des Forums (als Teil der ASP.NET Render Pipeline) und zum anderen auch den HTML-Code der E-Mails (ohne ASP).
Dazu braucht man auch kein extra NuGet Paket mehr, nur noch
>

D
DerPeter123 Themenstarter:in
22 Beiträge seit 2021
vor 3 Jahren

Auf der Seite: IRazorViewEngine Interface (Microsoft.AspNetCore.Mvc.Razor)
steht: "An IViewEngine used to render pages that use the Razor syntax."

Ist mit dem rendern gemeint, um hinterher aus der View (.cshtml) z.B. einen string zuerzeugen oder ist das Interface notwendig, um überhaupt razor zum templaten nutzen zu können? Das würde dann ja bedeuten das ichj nicht einfach eeine View (.cshtml) und ein Model (.cshtml.cs) in meiner consolen app hinzufügen kann?

Aber so wie ich das verstehe, funktioniert das mit dem hinzufügen eines models und einer view und die view kann ich dann mit dem interface zu einem string rendern?

F
10.010 Beiträge seit 2004
vor 3 Jahren

Hast Du Dir denn mal Razorlight angeschaut?
https://github.com/toddams/RazorLight


var engine = new RazorLightEngineBuilder()
	.UseFileSystemProject("C:/RootFolder/With/YourTemplates")
	.UseMemoryCachingProvider()
	.Build();

var model = new {Name = "John Doe"};
string result = await engine.CompileRenderAsync("Subfolder/View.cshtml", model);

Ist nun doch nicht wirklich viel

D
DerPeter123 Themenstarter:in
22 Beiträge seit 2021
vor 3 Jahren

@Fzelle: So wie ich das verstehe erstelle ich ein cshtml file in dem ich mit der normalen Razor syntax templaten kann und über @Model.name z.B. einen namen hinzufügen kann?
Dem Model kann ich dann über


var model = New ModelName
{
       name = "test"
};

werte zuweisen und mit


string result = await engine.CompileRenderAsync("Subfolder/View.cshtml", model);

kann ich dann meine view mit den werten des models zu einem String rendern?

16.806 Beiträge seit 2008
vor 3 Jahren

Ja, sieht man doch allein an der Rückgabe.

Wie wärs wenn Du einfach mal die Tipps annimmst, Dir das anschaust und es einfach mal ausprobierst...?
Wir programmieren das nicht für Dich, denke, da hast Du Verständnis für 🙂

D
DerPeter123 Themenstarter:in
22 Beiträge seit 2021
vor 3 Jahren

natürlich habe ich da verständnis für 🙂

Mein Ziel war nur ein Ja oder Nein auf meine Frage zu bekommen, ob ich es so richtig verstanden habe. Ich war mir nur recht unsicher ob ich es richtig verstanden hatte.
Werde es nun in den nächsten Tagen mal selber ausprobieren 🙂

T
2.219 Beiträge seit 2008
vor 3 Jahren

Und böse gesagt hättest du dir das ja oder nein auch selbst durch ein Testprojekt holen können.
Da musst du keine Zeit auf Rückmeldungen warten vergeuden. 🙂

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

D
DerPeter123 Themenstarter:in
22 Beiträge seit 2021
vor 3 Jahren

So ich habe das ganze getestet aber ein paar kleine Fehler sind dabei aufgetreten, für die ich keine Lösung weiß 😠


using System;
using System.Threading.Tasks;
using RazorLight;

namespace ConsoleApp3
{
    class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            var engine = new RazorLightEngineBuilder()
                .UseFileSystemProject("C:/RootFolder/With/YourTemplates")
                .UseMemoryCachingProvider()
                .Build();

            var myModel = new MyModel()
            {
                Name = "Peter",
                Age = 2
            };
            string result = await engine.CompileRenderAsync("./MyView.cshtml", myModel);
        }
    }
}


using Microsoft.AspNetCore.Mvc.RazorPages;
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp3
{
    class MyModel 
    {
        public string Name { get; set; }

        public int Age { get; set; }
    }
}


@model ConsoleApp3.MyModel

<p>Hello, my name is @Model.Name and I am @Model.Age </p>


<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc.RazorPages" Version="2.2.5" />
    <PackageReference Include="RazorLight" Version="1.1.0" />
  </ItemGroup>

</Project>

Fehlermeldung:
CS0060 Inkonsistenter Zugriff: Basisklasse "RazorPage<MyModel>" ist weniger zugreifbar als Klasse "_MyView".
CS0053 Inkonsistenter Zugriff: Eigenschaftentyp "IHtmlHelper<MyModel>" ist weniger zugreifbar als Eigenschaft "_MyView.Html".

Also die ersten beiden Fehler werden vermutlich kommen, weil ich kein public etc in meiner View habe? Aber os wie ich das verstanden habe erstelle ich die View so. Oder verwechsel ich da Razor Pages und RazorLight?

Hat jemand für mich eine Lösung?

PS: jetzt auch mit richtigen fehlermeldungen 🙂

PPS: einen Fehler habe ioch behoben. Ich hatte wohl das faslche Package installiert

16.806 Beiträge seit 2008
vor 3 Jahren

Für Compiler Errors kannst Du einfach die Hilfe aus dem Error Window verwenden.
Dann kommst auf die Dokumentation, die erklärt, wo das Problem ist. Siehe auch [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen)

In diesem Fall ist Deine Klasse private. Sie muss aber public sein (wie es in der Fehlermeldung auch steht).

D
DerPeter123 Themenstarter:in
22 Beiträge seit 2021
vor 3 Jahren

Da ich meine letzte Nachricht nicht mehr editieren kann: Hat sich alles geklärt. War natürlich ein super dummer Fehler... Habe tatsächliuch das public vor der class vergessen. Bin davon ausgegangen, dass das direklt automatisch passiert.

Habe jetzt auch zum Testen noch hinzugefügt, dass ich den String als html file auf dem Desktop speichern kann. Das hat auch soweit funktioniert. Vielen Dank für die nette und schnell Hilfe. Und sorry, wenn ich vlt etwas genervt habe 😉👍

D
DerPeter123 Themenstarter:in
22 Beiträge seit 2021
vor 3 Jahren

Ok sorry ich hätte doch noch eine weitere Frage, vlt kann mir ja nochmal jemand helfen 🙂

Ich habe nochmal versucht mit dieser Bibliothek die View zu einem string zu rendern: https://soundaranbu.medium.com/render-razor-view-cshtml-to-string-in-net-core-7d125f32c79

Meine Main hat sich so verändert:


        static async Task Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            var myModel1 = new MyModel()
            {
                Name = "Peter",
                Age = 22
            };

            var html = await RazorTemplateEngine.RenderAsync("./MyView.cshtml", myModel1);
        }

Model:


    public class MyModel
    {
        public string Name { get; set; }

        public int Age { get; set; }    
    }

View:


@page
@model ConsoleApp3.MyModel

<p>@Model.Name</p>

Wenn ich das ganz ausführe bekomme ich folgende Fehlermeldung:

Fehlermeldung:
System.InvalidOperationException: "Unable to find view './MyView.cshtml'. The following locations were searched:
/MyView.cshtml

Eigentlich wundert es mich das der die View nicht findet weil mit Razorlight hat es über den selben Pfad geklappt. Ich habe alle Files einfach in der ConsoleApp erstellt. Also keine Ordner oder so.
An der fehlenden DI kann das nicht liegen oder?

Vielen Dank 🙂

16.806 Beiträge seit 2008
vor 3 Jahren

Nur weil eine Pfadangabe mit Lib A funktioniert heisst das nicht, dass das auch mit Lib B funktioniert.
Die echte Razor SDK Engine arbeitet mit ~/Filename.cshtml Angaben, und nicht mit ./Filename.cshtml, was Du auch Deinem Medium-Link und den Razor Docs entnehmen kannst.

D
DerPeter123 Themenstarter:in
22 Beiträge seit 2021
vor 3 Jahren

Achso ja das habe ich vergessen zuerwähnen. Bei ~ statt Punkt kommt eine ähnliche Fehlermeldung.

Fehlermeldung:
System.InvalidOperationException: "Unable to find view '~/MyView.cshtml'. The following locations were searched:
~/MyView.cshtml

16.806 Beiträge seit 2008
vor 3 Jahren

Dann würde ich der Fehlermeldung glauben und das Zeug liegt zur Laufzeit nicht dort, wo gesucht wird.

D
DerPeter123 Themenstarter:in
22 Beiträge seit 2021
vor 2 Jahren

Ok und hast du eine Idee woran das liegen kann?

Ich bekomme ein ähnliches Problem, dass die View nicht gefunden werden kann, wenn ich es so probiere:
ASP.NET Core Render View to String – Paris Polyzos' blog

Wenn ich den Link von dir probiere:
ASP.NET Core MVC Render View to String

dann bekomme ich diese Fehlermeldung:

Fehlermeldung:
System.ArgumentNullException: 'Value cannot be null. (Parameter 'context')'

Der aufruf iost jedesmal so: (nur eben andere Methoden)


var result = await viewRendererService.RenderViewToStringAsync("~/EineView.cshtml", model);

Google verrät mir aktuell auch nichts hilfreiches, woran es liegen kann, dass die View nicht gefunden wird. Die View liegt direkt im Projekt und nicht in einem Ordner o.ä.

F
10.010 Beiträge seit 2004
vor 2 Jahren

Dann solltest Du versuchen zu verstehen was die Directory angaben "~" von Dir bedeutet.

D
DerPeter123 Themenstarter:in
22 Beiträge seit 2021
vor 2 Jahren

Also was ich gefunden habe, gibt "" das Root Verzeichnis meiner Applikation in Asp.net an. Heißt von da muss ich nur noch in meine View rein denke ich. Macht es vlt einen Unterschied das ich NetCore3.1 nutze?
Aber auch komplett ohne "
" und nur mit "/" wie in einem Beispiel einer Konsolen App funktioniert es bei mir nicht. Ich hatte auch mal den absoluten Pfad vom C-Verzeichnis probiert.

T
2.219 Beiträge seit 2008
vor 2 Jahren

Dann müsstest du mal prüfen wo dein Root Verzeichnis liegt.
Es muss nicht zwangsweise im Ordner deiner Anwendung sein.

Ansonsten solltest du auch sicherstellen ggf. mit einem File.Exists ob die View überhaupt Vorhanden ist.
Wenn diese nicht in den Ausgabe bzw. den richtigen Ordner kopiert wird, dann kann es auf deiner Seite auch nur knallen.

Nachtrag:
Damit kannst du im Web Teil deiner Anwendung den Pfad ggf. abfragen.
ASP .NET Core Pfad ermitteln/

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

D
DerPeter123 Themenstarter:in
22 Beiträge seit 2021
vor 2 Jahren

ok ich werde mir mal angucken wie ich das root-Verzeichnis prüfe.

Mit File.Exist hat es mit der "~" schreibweise weder bei der View noch bei einer .cs klasse funktioniert. Mit einem Absoluten Pfad hat er beides gefunden.
Habe es dann so nochmal probiert:


 var htmlString = await RazorTemplateEngine.RenderAsync("C:/weitereOrdner/EineView.cshtml", model);

Und dann findet er die View wieder nicht. Vlt klappt es auch nicht mit absoluten Pfaden und ich muss erst das root Verzeichnis prüfen?

Achja und einen richtigen Webteil habe ich glaube ich nicht. Ich habe eine .NetCore 3.1 consolen App mit verschiedenen Services, einem Model und einer View

16.806 Beiträge seit 2008
vor 2 Jahren

~/ ist die relative Darstellung zum Projektverzeichnis.
Bei "~/EineView.cshtml muss die Datei also im Hauptverzeichnis des Projekts liegen - und beim Deployment auch kopiert werden (Rechtsklick -> Properties).

Man muss niemals bei Razor irgendwie den Pfad manuell auflösen.
Den Link von T-Virus kann man daher ignorieren; das ist für dieses Thema hier irrelevant.

D
DerPeter123 Themenstarter:in
22 Beiträge seit 2021
vor 2 Jahren

@Abt
du meinst vermutlich dass ich eine Build action einstellen muss? Habe da ein paar die für mich aus der Doku heraus sinn gemacht haben ausprobiert, bisher habe noch nichts gefunden was funktioniert.

Ansonsten zu Razor Light:
Es funktioniert zwar bei einer "leeren" consolen app, aber wenn ich meinen Quellcode der ein Array anhand verschiedener Eingaben erstellt, davor ausführe bekomme ich später beim templaten diese Meldung:> Fehlermeldung:

System.TypeLoadException: 'Could not load type 'Microsoft.Extensions.Primitives.InplaceStringBuilder' from assembly 'Microsoft.Extensions.Primitives, Version=5.0.0.0, Culture=neutral,

Dazu habe ich auch folgendes gefunden: https://github.com/toddams/RazorLight/issues/365
Das hilft mir aber leider nicht, da ich den InplaceStringBuilder eig. nicht verwende. Und selbst wenn, dürfte das eig keine Auswirkung auf das rendern des Templates haben.

Mein Code sieht inetwa so aus:


var liste = host.CreateDefaultBuilder.GetRequiredService<Service>().Run();

var engine = new RazorLightEngineBuilder()
	.UseFileSystemProject("C:/RootFolder/With/YourTemplates")
	.UseMemoryCachingProvider()
	.Build();

var model = new {Name = "John Doe"};
string result = await engine.CompileRenderAsync("./View.cshtml", model);

Beim ausführen der CompileRender Methode kommt dann eben der obengenannte Fehler.
Wenn ich hingegen eine leere Anwendung erstelle ohne meinen Quellcode klappt es. Und ich finde es sehr merkwürdig das es nicht mehr klappt obwohl ich die Liste die oben zurück kommt gar nicht weiter nutze

D
DerPeter123 Themenstarter:in
22 Beiträge seit 2021
vor 2 Jahren

@Abt
du meinst vermutlich dass ich eine Build action einstellen muss? Habe da ein paar die für mich aus der Doku heraus sinn gemacht haben ausprobiert, bisher habe noch nichts gefunden was funktioniert.

achso das "copy to output diirectory" property hatte ich auch probiert. Hatte aber nichts geändert. Daher dachte ich das die Build action vlt noch eine andere Einstellung brauchte.