Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von DerPeter123
Thema: HTML-String als Download bereitstellen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

ok ich probiere es nochmal etwas anders. Vlt ist es aber auch nicht so ganz verständlich weil es so wie ich denke nicht möglich ist.

Also Fileserver oder Webserver oder so möchte ich eigentlich nicht.
Aktuell speichere ich ja meinen String in einem bestimmten Ordner auf meinem PC mit:


File.WriteAllText("C:/IrgendeinOrdner/MeineDatei.html", meinString);

Damit wird ja mein String in der HTML-Datei MeineDatei im Ordner IrgendeinOrdner gespeichert.
Wenn ich meine Anwendung jetzt in einer Cloud bereitstellen möchte, so das die Anwendung auch von anderen PCs ausgeführt werden kann, wird dass ja so wie oben nicht funktionieren. Daher wollte ich irgendwie die Datei als Download anbieten, so das sich nach dem Ausführen der Anwendung (z.B. per Knopfdruck auf einer Webseite) man auswählen kann, wo die Datei gespeichert werden soll. Aber wenn das nicht ohne Webserver o.ä. möglich ist, würde mir das als Antwort auch reichen.

Oder reicht es vlt schon einen "allgemein gültigen Ordner" unter Windows als Zielordner auszuwählen? Also z.B. direkt den Download-Ordner?

Also nochmal kurz: Ich drücke auf einer Webseite auf den Knopf "Ausführen". Meine Anwendung wird ausgeführt und erzeugt einen String der als html-Datei auf dem aktuellen PC gespeichert werden soll. Daher dachte ich hierbei an einen Download der dann gestartet wird und nach dem Verzeichnis fragt, in dem die Datei abgelegt werden soll

Thema: HTML-String als Download bereitstellen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

OK ich probiere nochmal es besser zuerklären

Also meine Konsolenanwendung erzeugt einen String der HTML beeinhaltet. Also sowas wie:


String x = "<!doctype html><html><body><h1>eine Überschrift<h1><body><html>"
Den String speichere ich aktuell als HTML Datei im lokalen Dateiverzeichnis ab.
Dabei kommt dann eine HTML Datei bei raus in der in diesem Fall "Eine Überschrift" steht.

Diese HTML Datei möchte ich jetzt aber nicht mehr in einem lokalen Dateiverzeichnis ablegen sondern möchte ich das automatisch ein Download gestartet wird. Also nicht die Datei auf einem Webserver ablegen wo die Datei heruntergeladen wird sondern dass der Download direkt startet wie in einem Browser wenn man ein word Dokument herunterlädt oder so

Ich hoffe das ist so verständlicher oder ist das nicht so einfach umzusetzen wir ich mir das vorstelle?

Thema: HTML-String als Download bereitstellen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi,

Ich habe eine Consolenanwendung die einen HTML-String erzeugt. Bisher speicher ich den String mit


File.WriteAllText(Path, String);
lokal im File-System ab.

Um die Anwendung aber unabhängig vom File-System zu machen, würde ich den HTML-String gerne als Download bereitstellen.
Also so das die Anwendung quasi "Cloud-fähig" ist und nicht vom Filesystem abhängig ist.
Beim Googlen bin ich bissher leider nicht fündig geworden. Evtl. google ich einfach nach den falschen Begriffen.

Vlt kann mir ja jemand auf die Sprünge helfen

Thema: Dokument mit C# und HTML
Am im Forum: Web-Technologien

Zitat von DerPeter123
@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.

Thema: Dokument mit C# und HTML
Am im Forum: Web-Technologien

@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:

Fehler
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

Thema: Dokument mit C# und HTML
Am im Forum: Web-Technologien

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

Thema: Dokument mit C# und HTML
Am im Forum: Web-Technologien

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.

Thema: Dokument mit C# und HTML
Am im Forum: Web-Technologien

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:

Fehler
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.ä.

Thema: Dokument mit C# und HTML
Am im Forum: Web-Technologien

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

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

Thema: Dokument mit C# und HTML
Am im Forum: Web-Technologien

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:
Fehler
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

Thema: Dokument mit C# und HTML
Am im Forum: Web-Technologien

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

Thema: Dokument mit C# und HTML
Am im Forum: Web-Technologien

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>

Fehler
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

Thema: Dokument mit C# und HTML
Am im Forum: Web-Technologien

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

Thema: Dokument mit C# und HTML
Am im Forum: Web-Technologien

@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?

Thema: Dokument mit C# und HTML
Am im Forum: Web-Technologien

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?

Thema: Dokument mit C# und HTML
Am im Forum: Web-Technologien

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

Thema: Dokument mit C# und HTML
Am im Forum: Web-Technologien

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?

Thema: Dokument mit C# und HTML
Am im Forum: Web-Technologien

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?

Thema: Dokument mit C# und HTML
Am im Forum: Web-Technologien

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

Thema: Dokument mit C# und HTML
Am im Forum: Web-Technologien

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

Thema: Dokument mit C# und HTML
Am im Forum: Web-Technologien

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)

Thema: Dokument mit C# und HTML
Am im Forum: Web-Technologien

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.