2011-04-10 13 views
5

Sto utilizzando l'oggetto XElement per creare codice HTML nel code-behind in una pagina ASP.NET.Come evitare System.Xml.Linq.XElemento di escape del contenuto HTML?

mi può o non può aggiungere un po 'XAttributes a questo XElement mentre vado avanti, nel modo seguente:

var elmnt = new XElement("div", 
    new XAttribute("id", "myDiv"), 
    ); 

Ora, se voglio aggiungere qualche contenuto in myDiv che contiene HTML, il XElement scappa automaticamente ciò che, nella mia situazione, non è desiderabile.

Quindi, se ho:

var elmnt = new XElement("div", 
    new XAttribute("id", "myDiv"), 
    "<span id='content'>hello world</span>" 
    ); 

E poi mi rendo questo in un oggetto segnaposto utilizzando il seguente codice:

myPlaceholder.Controls.Add(new System.Web.UI.WebControls.Literal { Text = elmnt.CreateNavigator().OuterXml }); 

Quando il caricamento della pagina, la fonte rivela che il contenuto interno interno elmnt è stato sfuggito e ha il seguente formato nella fonte della pagina:

&lt;span id='content'&gt;hello world&lt;/span&gt; 

Dato che l'XML che sto compilando qui è HTML valido, e il contenuto interno è anche HTML valido, come posso dire all'oggetto padre XElement a non sfuggire al contenuto interno? Come posso lasciarlo nel suo formato nativo?

risposta

7
var elmnt = new XElement("div", 
    new XAttribute("id", "myDiv"), 
    new XRaw("<span id='content'>hello world</span>") 
); 


public class XRaw : XText 
{ 
    public XRaw(string text):base(text){} 
    public XRaw(XText text): base(text){} 

    public override void WriteTo(System.Xml.XmlWriter writer) 
    { 
    writer.WriteRaw(this.Value); 
    } 
} 
-1

perché non si utilizzare HtmlTextWriter?

StringWriter stringWriter = new StringWriter(); 

HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter); 
htmlWriter.RenderBeginTag(HtmlTextWriterTag.Span); 
htmlWriter.AddAttribute(HtmlTextWriterAttribute.Id, "content"); 
htmlWriter.Write("hello world"); 
htmlWriter.RenderEndTag(); 

htmlWriter.Flush(); 

stringWriter.ToString(); //<span id='content'>hello world</span> 
+0

la classe HtmlTextWriter è contrassegnata come 'MustInherit', quindi con le mie conoscenze limitate non sono sicuro di come implementare un HtmlTextWriter nel mio oggetto XElement. So che è una grande domanda, ma potresti fornire un breve esempio di come convertirei (usando il mio esempio precedente) ' ciao mondo' in un oggetto HtmlTextWriter? – awj

+0

Devo anche dire che sono entusiasta di usare la classe XElement perché sto usando una cache su misura che accetta XElements, ma non sono sicuro che accetterà un'istanza di un HtmlTextWriter. Inoltre, stai suggerendo di sostituire l'intero XElement con un HtmlTextWriter piuttosto che usare questo per contenere semplicemente l'HTML interno? – awj

+0

@awj vedere il mio post aggiornato sull'utilizzo. Non capisco di cosa si parli di MustInherit, ma comunque questa classe è pubblica e già implementata. Suggerisco che per costruire html, HtmlTextWriter sia molto più semplice e potente di XElement. XElement è più generale – archil

0

Se si sta trattando il codice HTML come XML poi quando si aggiunge ad esso si deve aggiungere XML

Così si dovrebbe fare un nuovo XmlElement (arco), aggiungi un attributo (per ID attributo, valore contenuto) e quindi imposta il suo contenuto su "Ciao mondo". Prendi questo xmlelement e aggiungilo all'albero nel punto giusto.

Tutto questo sembra essere nella direzione sbagliata per me. Se si desidera essere in grado di avere contenuti "dinamici" nel codice sottostante, suggerirei di aggiungere un controllo o aps:placeholder alla pagina e quindi di impostare il contenuto di tale controllo sull'html nel codice sottostante. Questo è il modo standard per aggiungere contenuti dinamici.

+0

Il motivo per cui sto costruendo il contenuto in questo modo è che voglio memorizzare nella cache gli elementi della pagina - perché ciò accada, questi elementi devono essere serializzabili. Il contenuto all'interno di XElement proviene da un campo HTML in un CMS. Spero che questo spieghi a tutti i lettori della mia domanda perché sto cercando di ottenere un risultato usando XElement per contenere HTML. – awj

+0

@awj - niente di sbagliato in questo. Un 'asp: placeholder' potrebbe gestire una stringa dal tuo database bene. Niente è più serializzabile di una stringa. – Hogan

+0

@awj - in realtà un 'asp: literalcontrol' o' asp: label' è probabilmente quello che vuoi. Vuoi che io pubblichi un esempio su come usarlo? – Hogan

0

Ho risolto questo problema utilizzando HtmlAgilitypack per convertire la stringa di HTML in un oggetto gerarchico.

Ho quindi eseguito il looping di ciascun elemento HTML in questo oggetto e ho creato un XElement nidificato per ciascuno.

C'è un po 'di controllo che deve essere fatto su ogni elemento, ma funziona perfettamente e ha meno linee di codice di quanto mi aspettassi quando ho iniziato a costruirlo.

Problemi correlati