使用ReadXML()将XML子节点绑定到DataList时出现问题

本文关键字:DataList 问题 绑定 子节点 ReadXML XML 使用 | 更新日期: 2023-09-27 18:07:09

我试图将一个ASP DataList控件与从XML文件返回的值绑定。有点独特的是,我没有从文件中加载XML,而是使用XMLTextReader()将其作为字符串加载。这样做的原因是XML将根据从数据库读取的值构建。下面的代码接受(在本例中是硬编码的)XML字符串,将其添加到DataSet,然后绑定DataList控件…

StringBuilder xml = new StringBuilder();
    xml.Append("<product>");
    xml.Append("<sku>241</sku>");
    xml.Append("<prodID>2SIDED</prodID>");
    xml.Append("<name>Product Name</name>");
    xml.Append("<price>6.99</price>");
    xml.Append("<description>Product Description</description>");
    xml.Append("<standalone>1</standalone>");
    xml.Append("<sellable>1</sellable>");
    xml.Append("<product-type>10</product-type>");
    xml.Append("<customization>");
    xml.Append("<option1></option1>");
    xml.Append("<option2></option2>");
    xml.Append("<option3></option3>");
    xml.Append("</customization>");
    xml.Append("</product>");
using (XmlTextReader tr = new XmlTextReader(new StringReader(xml.ToString())))
    {
        var document = XElement.Load(tr);
        string source = document.ToString();
        DataSet dsProdList = new DataSet();
        dsProdList.ReadXml(new StringReader(source));
        prodDetail.DataSource = dsProdList;
        prodDetail.DataBind();
    }

这是DataList控件…

<asp:DataList ID="prodDetail" runat="server" OnItemDataBound="prodDetail_ItemDataBound">
    <ItemTemplate>
        <div class="proddetail">
            <asp:Image ID="Image" runat="server" width="480" height="325" AlternateText='<%#DataBinder.Eval(Container.DataItem, "name") %>'/>
            <asp:HiddenField ID="hdnStandalone" runat="server" Value='<%#DataBinder.Eval(Container.DataItem, "standalone") %>' Visible="false" />
            <asp:HiddenField ID="hdnSellable" runat="server" Value='<%#DataBinder.Eval(Container.DataItem, "sellable") %>' Visible="false" />
            <asp:HiddenField ID="hdnTypeId" runat="server" Value='<%#DataBinder.Eval(Container.DataItem, "product-type") %>' Visible="false" />
            <asp:HiddenField ID="hdnOption1" runat="server" Value='<%# DataBinder.Eval(Container.DataItem, "option1") %>' Visible="false" />
            <asp:HiddenField ID="hdnOption2" runat="server" Value='<%#DataBinder.Eval(Container.DataItem, "option2") %>' Visible="false" />
            <asp:HiddenField ID="hdnOption3" runat="server" Value='<%#DataBinder.Eval(Container.DataItem, "option3") %>' Visible="false" />
            <asp:Label ID="lblDescription" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "description") %>'>
        </div>
    </ItemTemplate>
</asp:DataList>

这似乎工作得很好,直到代码试图绑定"option1"在那一点上,我得到以下异常:数据绑定:"System.Data。DataRowView'不包含名为'option1'的属性

从我可以得出的结论,这显然是一个问题,"option1"是"定制"的孩子。如果我简单地注释掉开始和结束的"定制"标签,这有效地使"选项"作为"产品"的子元素,代码运行良好,我得到了我期望的输出。

是否有任何方法可以格式化DataBinder.Eval()来查看子项目?如果是这样的话,我也搞不清楚,几个小时的搜索都没有成功。还是我应该换个方式处理?也许不使用数据集?任何帮助都是感激的。谢谢。

使用ReadXML()将XML子节点绑定到DataList时出现问题

您可以尝试使用xDoc, linqanonymous类型,

prodDetail.DataSource = from item in xDoc.Descendants("product") 
        from needThis in item.Descendants("customization")
        select new 
        {       ProductName = item.Element("sku").Value,
                ID = item.Element("prodID").Value,
                //----other properties----
                Option1 = needThis.Element("option1").Value,
                Option2 = needThis.Element("option2").Value,
                //---and some more properties----
        };

您必须确保您提供的anonymous对象的属性名称与您在datalist的数据绑定中期望的属性名称相同。