我正在使用XElement对象在ASP.NET页面的代码隐藏中构建一些HTML。
我可能会或者可能不会在此过程中向此XElement添加一些XAttributes,方式如下:
var elmnt = new XElement("div",
new XAttribute("id", "myDiv"),
);
现在,如果我想在包含HTML的 myDiv 中添加一些内容,那么XElement会自动转义,在我的情况下,这是不可取的。
所以,如果我有:
var elmnt = new XElement("div",
new XAttribute("id", "myDiv"),
"<span id='content'>hello world</span>"
);
然后使用以下代码将其渲染到Placeholder对象中:
myPlaceholder.Controls.Add(new System.Web.UI.WebControls.Literal { Text = elmnt.CreateNavigator().OuterXml });
当页面加载时,源会显示 elmnt 中的内部内容已被转义,并且在页面源中具有以下格式:
<span id='content'>hello world</span>
鉴于我在这里编译的XML是有效的HTML,并且内部内容也是有效的HTML,我怎样才能告诉XElement父对象不转义内部内容?如何将其保留为原生格式?
答案 0 :(得分:8)
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 :(得分:0)
如果您将HTML视为XML,那么当您添加HTML时,您必须添加XML
因此,您将创建一个新的xmlelement(span),添加一个属性(对于属性id,值内容),然后将其内容设置为“hello world”。拿这个xmlelement并将它添加到正确位置的树上。
所有这些似乎都朝着错误的方向前进。如果您希望能够在后面的代码中包含“动态”内容,我建议:向页面添加asp:label
或aps:placeholder
控件,然后将该控件的内容设置为html中的html代码背后。这是添加动态内容的标准方法。
答案 2 :(得分:0)
我通过使用HtmlAgilitypack将HTML字符串转换为分层对象来解决这个问题。
然后,我循环遍历此对象中的每个HTML元素,并为每个HTML元素创建一个嵌套的XElement。有一些检查需要对每个元素进行检查,但它完美运行并且代码行数比我开始构建时所预期的少。
答案 3 :(得分:-1)
为什么不使用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>