Come posso creare un report html senza l’hardcoding dell’Html?

Attualmente eseguo il refactoring di un’applicazione console la cui responsabilità principale è generare un report basato sui valori memorizzati nel database.

Il modo in cui ho creato il report fino ad ora è il seguente:

const string format = "{0, 10} {1}{2, 8}{3}{4, -30} {5}{6}"; if(items.Count > 0) { builder.AppendLine( String.Format(format, "Date", "Id", "WorkItemId", "Account Number", "Name", "Address", "Description")); } foreach(Item item in items) { builder.AppendLine(String.Format(format, item.StartDate, item.Id, item.WorkItemId, item.AccountNumber, String.Format("{0} {1}", item.FirstName, item.LastName), item.Address, item.Description)); } string report = String.Format("{0} 
", builder.ToString());

(Quanto sopra è solo un esempio … e mi dispiace per la formattazione … Ho provato a formattarlo in modo da non richiedere lo scorrimento orizzontale ….)

Non mi piace davvero come l’ho fatto. Funziona e fa il lavoro per ora … ma non penso che sia gestibile … in particolare se il report diventa più complesso in termini di html che deve essere creato. Peggio ancora, altri sviluppatori del mio team sono sicuri di copiare e incollare il mio codice per le loro applicazioni che generano un rapporto html e sono suscettibili di creare un pasticcio orribile. (Ho già visto questi orrori prodotti! Immagina una funzione di rapporto che ha centinaia di righe di SQL codificati per recuperare i dettagli del rapporto … è abbastanza per far piangere un uomo adulto!)

Tuttavia, anche se non mi piace affatto … Non riesco a pensare a un modo diverso di farlo.

    Sicuramente ci deve essere un modo per farlo … ne sono certo. Non molto tempo fa stavo facendo la stessa cosa generando tabelle in pagine aspx fino a quando qualcuno mi ha mostrato gentilmente che posso semplicemente bind gli oggetti a un controllo e lasciare che .NET si occupi del rendering. Ha trasformato il codice orribile, simile al codice sopra, in due o tre linee eleganti di bontà.

    Qualcuno sa di un modo simile di creare l’html per questo report senza hard-coding l’html?

    Crea la tua app per produrre file XML con dati grezzi. Quindi applica un XSLT esterno ad esso che contiene HTML.

    Maggiori informazioni: http://msdn.microsoft.com/en-us/library/14689742.aspx

    È ansible utilizzare un motore di template come NVelocity per separare la vista del report e il codice. Ci sono probabilmente altri modelli di template decenti là fuori …

    meziod – Un’altra strada da esaminare è i metodi di estensione all’object HtmlTextWriter. Ho trovato una pugnalata brillante proprio su questo stesso sito.

    HtmlTextWriter estensione

    Sono certo che potresti sfruttare un grande potenziale da questo …

    saluti – coola

    Bene, è ansible utilizzare uno dei framework di report (Crystal, MS RDL, ecc.) Ed esportare come html, tuttavia, ho il sospetto che per i dati semplici il tuo approccio attuale sia meno sovraccarico. Potrei usare un XmlWriter o LINQ-to-XML (piuttosto che string.Format , che non gestirà l’escaping) …

      new XElement("tr", new XElement("td", item.StartDate), new XElement("td", item.Id), new XElement("td", item.WorkItemId), 

    ecc. L’escaping è particolarmente importante per i valori di testo (nome, descrizione, ecc.).

    Potresti considerare l’utilizzo di un semplice motore di template come http://www.stefansarstedt.com/templatemaschine.html e separare il modello dal contenuto.

    Questo è abbastanza pratico, consente la modifica del modello senza ricompilare e hai ancora il potere C # nei tuoi modelli.

    Microsoft SQL Reporting Services funziona abbastanza bene e può eseguire più formati.

    La mia azienda lo utilizza per creare report PDF e, poiché abbiamo i requisiti HIPAA, viene automaticamente inserita una password tramite un controllo PDF di terze parti …

    Come già detto da Coolashaka, l’utilizzo di HtmlTextWriter è una buona opzione, certamente se si aggiungono alcuni metodi di estensione utili, ad esempio:

    Semplice esempio:

     public static void WriteNav(this HtmlTextWriter writer, List navItems) { writer.RenderBeginTag("nav"); writer.RenderBeginTag(HtmlTextWriterTag.Ul); foreach (var item in navItems) { writer.RenderBeginTag(HtmlTextWriterTag.Ul); writer.AddAttribute(HtmlTextWriterAttribute.Href, "~/" + item + ".html"); writer.RenderBeginTag(HtmlTextWriterTag.A); writer.Write(item); writer.RenderEndTag(); writer.RenderEndTag(); } writer.RenderEndTag(); writer.RenderEndTag(); } 

    So che questa è una vecchia domanda, ma Google continuerà a dirigere le persone qui negli anni a venire.