Привязать столбец XML и обычные столбцы с сервера SQL во вложенных элементах управления - PullRequest
0 голосов
/ 03 февраля 2010

У меня есть хранимая процедура, которая возвращает смесь простых столбцов и один «столбец» типа данных xml. Как в:

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 был привязан к вложенному повторителю, так как он содержит данные parent-child.

Я попытался установить для источника данных повторителя имя столбца, например:

    <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.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2010

Хотя это и не позволяет мне делать это полностью декларативно, это работает на основе информации Брайана.Возможно, синтаксис привязки уже существует, но у меня нет времени разбираться с этим!

Повторитель:

<asp:Repeater ID="rp" runat="server" DataSource='<%# EnumerableCertifications(Eval("Certifications")) %>'>
  <ItemTemplate>                 
    <%#Eval("certification")%><br />
  </ItemTemplate>
</asp:Repeater>

Codebehind (vb.net, но вы поняли идею):

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
0 голосов
/ 03 февраля 2010

Можете ли вы использовать LINQ to 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-документа в анонимный тип, который может отражать ретранслятор. Я уверен, что некоторые синтаксис немного не в порядке (не помню, если это свойство Value или что-то другое, мой linq to XML немного ржавый :-)), но это в основном то, как это можно сделать из кода. 1004 *

Встроенная разметка Я не знаю, работает ли какой-либо подход, поскольку он исходит из базы данных. XmlDataSource требует файл, а не столько из базы данных (по крайней мере из того, что я знаю, может быть неправильно).

НТН.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...