.net 在嵌套控件中绑定sql server中的xml列和常规列
我有一个存储过程,它混合返回普通列和一个xml数据类型的“列”。例如:.net 在嵌套控件中绑定sql server中的xml列和常规列,.net,sql-server,xml,sql-server-2005,.net,Sql Server,Xml,Sql Server 2005,我有一个存储过程,它混合返回普通列和一个xml数据类型的“列”。例如: Select Field1, Field2, ( SELECT Certification As '@certification', LCID As '@lcid' FROM dbo.MemberCertifications FOR XML PATH('certification'), TYPE, ROOT('certific
Select
Field1,
Field2,
(
SELECT
Certification As '@certification',
LCID As '@lcid'
FROM
dbo.MemberCertifications
FOR XML PATH('certification'), TYPE, ROOT('certifications')
) AS Certifications
FROM
.......
我将此结果绑定到gridview,并且需要将xml列绑定到嵌套的repeater,因为它包含父子数据
我已尝试将repeater数据源设置为列名,如下所示:
<asp:Repeater ID="rp" runat="server" DataSource="<%# Eval("Certifications") %>">
<ItemTemplate>
<%#XPath("//@certification")%>
</ItemTemplate>
</asp:Repeater>
但这不起作用。它看起来就像一根普通的绳子。如果我只是在ItemTemplate中写一个换行符,它会为列中的每个字符包含一个换行符
我也尝试过内联使用xmldatasource,但遇到了一个解析器错误:
<asp:XmlDataSource ID="data_certs" runat="server" >
<%# Eval("Certifications") %>
</asp:XmlDataSource>
我在这里已经走到了尽头——我正准备通过反序列化xml在代码中构建结果。我其实并不需要任何gridview功能
有什么想法吗?你能用LINQ转换XML吗?您可以使用以下方式加载它:
XDocument document = XDocument.Load(" .. xml content here ..");
rpt.DataSource = document.Root.Elements("certification").Select(i => new { Field1 = i.Element("Field1").Value, Field2 = i.Element("Field2").Value });
rpt.DataBind();
基本上,我所做的是将XML文档转换为匿名类型,中继器可以对其进行反射。我肯定有些语法有点不对劲。我不记得它是值属性还是其他什么,我的linq到XML有点生疏:-但这基本上是从代码中实现的
内联标记我不知道任何方法是否有效,因为它来自数据库。XmlDataSource需要一个文件,而不是来自数据库的文件,至少据我所知,可能是错误的
HTH.虽然不完全允许我以声明的方式完成这项工作,但它是基于Brian的输入工作的。也许绑定语法已经出现了,但我没有时间来整理它 中继器:
<asp:Repeater ID="rp" runat="server" DataSource='<%# EnumerableCertifications(Eval("Certifications")) %>'>
<ItemTemplate>
<%#Eval("certification")%><br />
</ItemTemplate>
</asp:Repeater>
是的,通过编程实现这一点是可能的——无论是使用linq还是反序列化。我想我想知道如何以声明的方式实现这一点。linq to xml可以做到这一点,就像使用普通xml和xpath绑定语法一样,但linq更简洁。谢谢你的建议。
Public Function EnumerableCertifications(ByVal xml As Object) As IEnumerable
If xml Is DBNull.Value OrElse String.IsNullOrEmpty(xml) Then
Return Nothing
Else
Using sr As New System.IO.StringReader(xml.ToString())
Dim document As XDocument = XDocument.Load(sr)
Dim q = From c In document.Descendants("certification") Where c.Attribute("lcid").Value = Locale.ToString() _
Select New With {.certification = c.Attribute("certification").Value}
Return q
End Using
End If
End Function