Mr Sparkle schreibt doch genau die Antwort. Wenn es Open Source gibt, warum dann nicht auch benutzen ... und meine Preisvorstellung hatte ich doch im Eröffnungspost mitgeteilt.
Problem ist doch auch oft, dass man was zahlt und davon nur paar Prozent wirklich benötigt, so wird dann das Produkt, welches man einsetzt halt sehr teuer.
Ich habe genau das gefunden, was ich benötige und der Preis ist (mehr als) doppelt niedriger als vorgestellt.
Klar muss Software auch was kosten und Unternehmen müssen auch ihr Geld verdienen, aber ich bin Softwareeentwickler und muss auch auf diesem Gebiet schauen, meinem Unternehmen hier die besten Lösungen zu präsentieren, denn sonst bräuchten sie keinen Softwareeentwickler und könnten sich über die Hintertür jeden "Mist" andrehen lassen - davon kann ich echt ein Lied singen ...
Geht mal auf verschiedene (Internet ect.) Messen, da haut es einem die Kinnlade runter, was Anbieter da zum Teil für Lösungen verlangen. Klar gibt viele Unternehmen, die Funktionen in ihrer 0815-Webseite möchten, aber keine Entwickler im Haus beschäftigen, dann wird eben "abgezockt" (zum Teil gewaltig) ...
Ich verstehe es ehrlich gesagt nicht. Warum soll man auch bei extern zugekaufter Software immer die erstbesten (aufgedrehten) Lösungen nehmen und nicht diejenigen, die im Preis/Leistungs/Anforderungsverhältnis am besten passen?
Danke euch nochmal allen für die Hinweise - hat mir sehr geholfen ...
Ich werde es jetzt mit dem Open-Source-Tool wkhtmltopdf probieren.
Gibt einen Anbieter, der für .NET einen Wrapper zur Verfügung stellt für einen für mich passablen Preis.
ich verstehe schon auf der einen Seite Deine Argumentation, aber ich bin Entwickler und kann doch mit ein paar Klicks das jetzt auch schon völlig kostenlos machen.
Zum Beispiel kann ich in OpenOffice ein Dokument erstellen und das dann als PDF speichern.
Jetzt muss es doch möglich sein, in so ein Dokument Platzhalter einzubauen, diese programmiertechnisch zu manipulieren und dann als PDF zu speichern ohne hunnderte (tausende) von Euros ausgeben zu müssen.
Ich kann es ja eigentlich jetzt schon völlig kostenlos machen (und das schon seit Jahren), nur ist das halt mühselig alles in eine Klasse zu packen ohne Trennung von Formatierung und Erstellungslogik.
Danke Dir erstmal für den Hinweis. Ich suche mal weiter und hoffe, eine Lösung zu finden, mit der ich leben kann.
Ich müsste ein paar PDFs generieren, welche sehr viele Produktinformationen (inklusive Tabellen und Grafiken) enthalten.
Nun kann man dies ja gut mit PDFsharp erstellen, aber mir graust es jetzt schon vor dem Quellcode mit den ganzen Paragraphen, Positionierungen, Formatierungen ext. - der Sourcecode sieht übel aus und zusätzlich kann nur ein Programmierer das dann auch noch ändern, also dachte ich an eine Art Template, welches dann ein Prozessor einliest und daraus ein PDF erstellt.
Bevor ich jetzt anfange selber was zu coden, dachte ich mal, ich frage hier, da ich im Internet nichts dazu gefunden habe - außer Lösungen die > 2k EUR kosten, was ich für zu teuer halte.
Habt ihr da Tools zu empfehlen, bzw. Erwahrungswerte mitzuteilen?
Ich würde gerne aus einem bekannten Format (z.B. JSON, XML, im Optimalfall HTML) die Beschreibung hinterlegen mit dynamischen Platzhaltern und ein Prozessor ersetzt die Platzhalter mit Daten und generiert aus der Beschreibung die PDFs.
Das hätte den Vorteil, dass das Layout schon mal getrennt wäre und auch sog. "Nichtprogrammierer" da Anpassungen durchführen könnten.
So ein Tool darf auch was kosten, denn man muss ja nicht immer das Rad neu erfinden, aber für sowas würde ich nicht mehr als 500 EUR ausgeben.
Was mich ein wenig wundert ist, dass ich dazu wenig finde. Ist denn das Problem nicht sehr oft in Unternehmen anzutreffen, aus einer Vorlage dann letztendlich PDFs zu generieren?
Thx euch schon mal vorab für etwaige Hilfe und Anregungen.
erst mal vielen Dank. Ich habe die letzten Jahre den IE "sträflichst vernachlässigt" ... das wäre eine Lösung meines Problemes - kann man irgendwo sehen, wie die Einstellungen sind, oder anders gefragt, wo kann man da was einstellen, bzw. sich einlesen?
Ich danke dir für den Hinweis, denn das hat mich wieder mal ein paar Stunden gekostet, weil es ja beim FF und Chrome funktioniert hat.
ich habe den sehr komischen Effekt, dass mit dem Internet-Explorer 11 auf meiner lokalen Umgebung alles funktioniert und auf Serverumgebungen (2008 und 2012) nur teilweise.
Mit Firefox und Chrome funktioniert es überall:
Auf den Serverumgebungen wird zwar das JavaScript ausgeführt und die Div mit dem Text "Klick Me!" gerendert, aber das Ereignis wird nicht gefeuert.
Warum geht das jetzt nur auf den Serverumgebungen nicht? Ich habe schon alle Einstellungen durchprobiert.
Danke mal vorab für etwaige Hilfe.
P.S. Mir ist klar, dass ich das über einen Eventhandler hinbekommen könnte, aber das ist viel zu aufwändig, weil ich sehr viele Fremdbibliotheken verwende, wo genau solche Sachen eben nicht laufen, bzw. angezeigt werden.
Strange ist eben, dass es bei mir lokal auf allen Browsern geht und auf dem Server nur nicht mit dem Internet Explorer.
Ich bin der Meinung, dass hier die Fehleranfälligkeit gegen 0 geht und vom Standard auch nicht abgewichen wird, denn in meinem Fall handelt es sich um eine Option, die Usern anbietet, die Formatierungen nach ihrem Gusto einzustellen völlig unabhängig von der Culture der Laufzeitumgebung und Herkunft der User, bzw. der eingestellten Sprache.
Ich hab es jetzt mit dem NumberFormatInfo-Objekt gelöst.
Beispiel für user a:
Dim deci As Decimal = 2500.5
Dim nfi As NumberFormatInfo = New NumberFormatInfo()
nfi.NumberDecimalSeparator = ","
nfi.NumberGroupSeparator = "."
Console.WriteLine(deci.ToString(",#.00", nfi)) // ==> 2.500,50
und das geht auch unabhängig von der aktuellen (Thread) CultureInfo
ist es möglich in C# Nummern, z.B. Decimal verschieden zu formatieren nur anhand eines Patterns / Expression ohne Cluture-Objekten?
Ich kenne das nur mit den Culture-Objecten (IFormatProvider) - ist es auch irgendwie anders möglich.
Beispiel. Ich habe die Zahl 2500.50 (englisch standard, also so in der DB), jetzt gibt es auf der Applikationsumgebung jeweils zwei User aus Deutschland und USA und jeweils auf einem en-US-System und auf einem de-System, welche die Zahlen unterschiedlich angezeigt bekommen möchten.
(de) User a) 2.500,50
(de) User b) 2,500.50
(us) User c) 2.500,50
(us) User d) 2,500.50
Gibt es da eine Möglichkeit das an einem Pattern (# und / oder 0) festzumachen OHNE eine CultureInfo, bzw. IFormatProvider?
also, ich verstehe das jetzt überhaupt nicht. Was hat denn HTTP damit zu tun ob man eine neue Instanz von, siehe obiges Beispiel, Auction erstellt oder eine gebrauchte, bzw. registrierte manipuliert?
Der liest im Endeffekt nur aus dem Request die Parameternamen und schaut mittels Reflection ob es in der Klasse die jeweiligen Properties gibt. Warum soll man da eine neue Instanz (IMMER) erstellen müssen?
Ich muss jetzt in der Session zwischenspeichern und rübbermappen, das ja auch nicht sehr schön, aber ich muss das so machen, da ich die "Entities" auch in anderen (nicht MVC) Projekte in einem separatem Service/Model Projekt benutze. Ich möchte ja nicht auf die Datenbank gehen und erst schauen, ob im Request neue Werte vorhanden sind und IMMER speichern möchte ich auch nicht, weil ich das unprofessionell finde. Ich speichere nur, wenn sich etwas geändert hat.
Ich sehe ja irgendwie ein, dass es nicht geht, aber warum es NICHT GEHEN darf, bzw, was es mit HTTP zu tun haben soll erschließt sich mir überhaupt nicht.
Das ist jetzt Philosophie. Für mich ist CRUD-Funktionalität (zum Darstellen, Mappen und Wegschreiben in Basisklasse mittels Serviceaufruf), Formatdarstellung, Sprachsteuerung und Berechtigungsprüfung immer das selbe und keine Logik und für mich jederzeit zentral auslagerbar. Nur darum geht es mir - das ist keine Logik für mich.
Das Model ist bei mir völlig in einem anderen (neutralen) Projekt mit Servicemethoden weggekapselt.
Mir wäre es lieber, das Framework würde auf das Ursprungsmodelobjekt mappen - da kenne ich mich noch nicht so aus, wie das gehen sollte, weil aktuell erstellt er immer als Parameter für die Action eine neue Instanz des Modelobjektes.
Siehe Seite 41 in dem von dir verlinkten Buch: "Model binding complex objects"
Vielen Dank für den Hinweis. Das Problem ist aber gerade, dass bei dem Beispielcode:
public ActionResult Create(Auction auction)
{
// ... Hier kommt die auction als neue Instanz, ich brauch die registrierte Instanz auf welche dann die Requestparameter gemapped werden.
}
Das Modelobjekt "Auction" eine neue Instanz ist und genau das würde ich sehr gerne vermeiden, weil ich dann sehr viel "Zusatzaufwand" habe, da ich dann in einem Filter ein "Zurückmappen" durchführen muss. Ich habe in allen Modelobjekten schon in den Basisklassen alles was ich brauche (Touched- bzw. Dirtyflag, Caching usw.)
Es sieht so aus, dass das nicht geht. X(
Ich denke, dass ich es schon verstanden habe, weil ich 2005 schon mit Struts / Java gearbeitet und da ist vieles ähnlich, Filter, Model, Actions ect.
Das Problem welches ich habe ist, dass bei einem Post an dem URL alle Parameter (gehängt) werden, die vorher vorhanden waren. Das schaut unschön aus. Mir wäre es lieber, das Framework würde auf das Ursprungsmodelobjekt mappen - da kenne ich mich noch nicht so aus, wie das gehen sollte, weil aktuell erstellt er immer als Parameter für die Action eine neue Instanz des Modelobjektes.
ich möchte den Code aber nur ein einziges mal schreiben.
Nehmen wir an, ich habe eine globale ID "TEST123" festgelegt in der Administrationsmaske, dann möchte ich in der View eigentlich nur noch @RenderFor("TEST123") schreiben und in RenderFor passieren dann verschiedene Dinge, wie Berechtigungsprüfung, Laden Language für Label, bzw. Codes für IDS, welches Tag gerendert werden soll, und genau hier dann je nach Tag, z.B. INPUT, TYPE TEXT die jeweiligen Razor Rendermethoden aufrufen. Ich könnte auch für jedes Tag eine eiene View erstellen, aber dann hab ich mehrere Stellen zu pflegen, Name, class, Id usw.
a) Wenn ich hier explizit method Type "POST" angebe, dann macht er mir einen ganz häßlichen Requeststring mit den ganzen Parametern - lasse ich das POST weg, werden auch die Formdaten geposted, aber nur die Felder, welche auch bearbeitet werden auf der View, so ist z.B. eine ID dann weg
b) Wie kann ich sicherstellen (wenn überhaupt möglich), dass er die bestehende Instanz verwendet, denn aktuell legt er (bedauerlicherweise???) eine neue Instanz an und nimmt nicht das initiale Modelobjekt. Wahrscheinlich macht er das dann später anhand von dem Actionparameter? Kann man das nicht gleich festlegen, bzw. mitteilen, dass er die Instanz verwenden soll, weil das würde mir sehr viel Arbeit sparen, denn ich habe in den Objekten eine Art Cache um feststellen zu können, ob auch wirklich Änderrungen durchgeführt wurden. So müsste ich jetzt nochmal (Session) zwischenspeichern und dann selber mappen in einem Filter.
Ich will hier erst mal auf Nummer sicher gehen und nachfragen, nicht dass ich dann wieder umsonst sehr viel Arbeit mache, weil man doch irgendwo einstellen kann auf welches Objekt er mappen soll.
Das "CMS-like" sollte kein Problem werden. Ich muss mir nur noch zusammensuchen, wie ich einen eigenen Helper programmieren kann und in diesem im Optimalfall die "Code-Behind-HTML-Tag-Generierungsmethoden" von Razor je nach Gebrauch aufrufen kann und das gerenderte HTML dann zurückgeben.
Ich mach mal den Fred wieder auf. Ich habe mich jetzt eingelesen in MVC und das werde ich auch verwenden. Jetzt stellt sich mir weiterhin die Ausgangsfrage.
Ich würde gerne soviel wie möglich wegkapseln und bin mir noch nicht im klaren, wie ich das mit MVC umsetzen kann.
Wenn ich z.B. mittels MVC ein Textfeld darstellen möchte mit Label, würde ich auf der Template-Seite u.a. folgendes schreiben:
... würde das jetzt noch in Verbindung mit Berechtigung, Mehrsprachigkeit und Zugriffssteuerung (Readonly ect.), müsste ich schon ein paar Abfragen mittels Razor drum rum basteln, was ich aber unbedingt vermeiden möchte.
Ich würde gerne eine globale ID vergeben, z.B. "LOG12NAME" in einer Administrationsmaske. Hier definiere ich das Mapping (Datenbank), Berechtigungen und Sprachsteuerung.
Ich würde dann gerne auf den jeweiligen .*html-Template-Seiten nur noch (mittels HTML-Helper?) in etwa so etwas stehen haben wollen:
@RenderFor("LOG12NAME")
Je nach Berechtigung, Sprachsteuerung und Zustand, wird dann das Tag mit dem Label gerendert.
Wie kann ich sowas angehen, bzw. umsetzen? Als Partial View eher nicht denke ich. Gibt es die Möglichkeit einen eigenen Helper zu basteln, der direkt eine Klasse aufruft - dort könnte ich dann die Abfragen machen. Dann stellt sich die Frage, ob ich im Quellcode an die "Code-Behind-Razor-Methoden" zum rendern von HTML-Tags komme, z.B. Html.LabelFor oder Html.EditorFor.
Naja, zur Not kann ich auch eine .ashx-Klasse machen als "zentralen Server-Controller", welche die angeforderten Seiten (HTML-Templates) lädt und an das Clientscript als AJAX-Response demenstprechend gerendert zurückliefert.
Ne, mir ist schon klar, dass die JavaScript-Libraries keine Bestandteile von ASP.NET sind, aber ich glaube mal gelesen zu haben, dass Microsoft das aktiv (zumindest jQuery) supported und dann hat man doch schon mal ein gewichtiges Argument, wenn man es auch verwenden möchte in der Firma.
Ich werde mal die nächsten Tage mich einlesen in Angular und MVC und dann eine Lösung für mein Problem finden.
Wichtig wäre mir nur, dass man die Forumlarobjekte, welche man generieren muss, auch als Objekte auf dem Server ansprechen kann und nicht mittels (Regex) Parsing der HTML-Templates) sich das alles selber zusammenbauen muss. Ich stelle mir das (aktuell) so vor, dass man das HTML-Template lädt auf dem Server, und dann die Controls demenstprechend manipuliert, bzw. wegen Berechtigung, erst gar nicht anzeigt, und hier würde ich die Controls gerne als Objekte ansprechen, so wie es im "klassischen" ASPX mit Webforms auch möglich war. Dann wird die fertige Seite als Response dem AJAX-Aufruf zurückgegeben. JavaScript wäre dann auf dem Client nur dafür da, die benötigten Seiten zu laden und darzustellen und (Submit) Validierungen durchzuführen. Die Logik soll weiterhin auf dem Server stattfinden.
naja, ich verwende die WebForms ja noch gar nicht, ich kenne sie nur, bzw. bin ich da "ausgestiegen" damals ...
Ich hab die letzten Jahre nur Desktopanwendungen gemacht oder Chrome/FF-Extensions programmiert.
Letztendlich rendern doch alle Technologien HTML(5)-Code, wenn ich das richtig verstanden habe?
Ich hab mal kurz MVC angesehen und mir ist da bisschen anders geworden, weil ich es nie leiden konnte, wenn im Hintergrund Zeugs generiert wird, was man nur zu 5 Prozent benötigt. ... ich mag lieber "thin- and clean"-Sachen, wo man zur Not selber Hand anlegen kann.
Ich schau mir jetzt mal näher Angular an. Ist Angluar, wie jQuery, mitlerweile auch fester Bestandteil von ASP.NET, bzw. wird (offiziell von Microsoft) unterstützt?
ich mache mir gerade ein paar Gedanken, wie ich für einen Betrieb ein Webframework machen kann und u.a. stelle ich mir es so vor, dass man auf einer Administrationsseite für jede Seite Controls definieren kann und diese gleich mit Datenbankspalten verknüpfen kann, so dass man sich zentral um Internationalisierung, Berechtigung, Validierung, Binding usw. kümmern kann.
Da wir absolut keine klassischen Seiten machen möchten, also, wo der Browser den Response bekommt und nach einem Serverroundtrip die komplette Seite lädt, soll alles über AJAX laufen, so dass das Verhalten einer Desktopanwendung nachgeahmt wird.
Jetzt stellt sich mir die Frage, wie ich die Controls aufbaue. Ich könnte komplett auf *.aspx-Seiten verzichten und meine eigenen Tags ausparsen auf dem Server und HTML wegschreiben oder ich könnte es über sog. User-Controls lösen - diese müssten dann aber nested unterstützen, ist das der Fall, hat da jemand Erfahrungen.
Aufgrund der Firmenphilosophie muss es eine .NET-Anwendung sein, bzw. muss als Webserver dann auch der IIS laufen.
Ist sowas (also nested) in etwa möglich mit klassischem ASPX-Usercontrols?
<company:control key="xyz">
<div>Hello World to english speakers!</div>
<company:control key="123">
<span>Hello Admin, you can see me!</span>
<company:control key="AAA">
<!-- will render <input type="text" data-validation value="Hey, Dude!" /> -->
<!-- or framework tag usage <asp:TextBox></asp:TextBox> -->
</company:control>
</company:control>
</company:control>
Ggf. andere Ideen? Es war sehr, sehr viel Überzeugungsarbeit nötig, um überhaupt jQuery einsetzen zu dürfen - also weitere Libraries sollten nicht verwendet werden.
Wenn ich das IE-Fenster zumache und innerhalb von 5 Sekunden ein neues aufmache, dann geht es, nach 5 Sekunden ist alles wieder weg, wtf?
Ggf. liegt es daran, dass noch nicht alles komplett aufgeräumt wurde und alte Sachen beim Neustart wiederverwendet werden.
Ich werd aus diesem Verhalten nicht schlau.
Nachtrag:
Auch aus einem fremden Netz heraus wird dann der Wert wieder zurückgesetzt nach bestimmter Zeit. Verhalten wie ein sessionStorage-Objekt auch im Netz. Muss man da im IE was einstellen?
Bei den anderen Browsern funzzt das auch über eine Session hinweg.
Beim Internet Explorer nicht, da muss man dann folgendes verwenden, was auch in allen anderen Browsern funktioniert.
Sicher, dass Du localStorage und nicht sessionStorage verwendest?
Was sagt der Chrom Debugger zum aktuellen Zustand (F12) bzw. Firefox Developer (nicht der normale FF).
Nachtrag:
Wenn ich aus einem fremden Netz die Domain aufrufe (in meinem Netz), dann funzzt es auch im IE. Wenn ich aus meinem Netz die Domain aufrufe, dann verhält es sich wie ein sessionStorage-Objekt.
Chrome und FF funktionieren einwandfrei, so wie erwartet.
Ich hab das jetzt nochmal ausprobiert mit einer Domain im Web. Funktioniert da komischerweise auch nicht.
Ich rufe eine Domain im Netz auf und lasse mir eine Variable vom localStorage anzeigen und setze danach einen default-Wert.
Immer, wenn ich die Seite in einem neuen Fenster aufrufe, dann ist das Teil empty. Bei einem Refresh im Browser ist das Teil gesetzt.
Das Verhalten ist wie bei einem localSession-Objekt. WTF?
Ich muss jetzt doch noch einmal den Thread hier öffnen.
Ich habe lokal eine Domain vergeben für den lokalen IIS und dann funktioniert es im IE auch nach einem Refresh in der gleichen Browsersession - was vorher nicht ging.
Nun ist es aber immer noch so, wenn ich eine neue Browsersession öffne mit neuem Fenster, dann sind die Einstellungen wieder weg ... wtf?
Ich kann mir nicht vorstellen, dass man im Intranet diese Funktionalität nicht benutzen kann.
Es muss doch auch möglich sein für "Web-"Applikationen, die im lokalen Netzwerk laufen?
ich hab jetzt seit ein paar Tagen immer mal wieder eine zeitlang nach einer Lösung, bzw. Bug, gesucht und finde einfach nichts für das "simple Problem".
Ich habe in einem lokalen Netzwerk eine Webanwendung, welche lokal auf den Clients das LocalStorage Objekt benutzt für Benutzereinstellungen.
Chrome und die neusten FF-Versionen laufen so, wie sie auch sollen, nur der Internet Explorer "zickt" rum und verhält sich so, als ob es sich um ein LocalSession Objekt handelt, das bedeutet, während der Session speichert er alles so wie es auch sein soll, aber wenn ich eine neue Session aufmache, dann sind die Einstellungen alle weg.
Vielleicht "stolpert" hier einer mal drüber und kennt das Problem, denn ich weiß jetzt aktuell auch nicht weiter - dachte, dass es MSIE 11 unterstützt, weil ich auf dem 9er das Phenomän beobachtet habe und dann auf MSIE 11 ein Update durchgeführt habe aber mit dem gleichen Ergebnis.
Wer benutzt eigentlich diesen Dino noch? - Leider muss ich den auch unterstützen
Also, in einer Session funktioniert alles aber sobald ich eine neue aufmache oder ein neues Fenster öffne im IE, dann ist alles weg - sehr komisch.
.. klar, den gibt es auch nicht, aber in vielen Betrieben gibt es auch keine "Vernunft", oder (zugegeben etwas zynisch) anders ausgedrückt. Wie erkläre ich einem Blinden die Farben (gefühlter) Teil 27