Атрибуция XML в наборе данных - PullRequest
1 голос
/ 23 мая 2010

Я хочу привязать элемент управления Repeater к набору данных, который заполнен данными XML, но я не знаю, как отобразить атрибуты внутри повторителя.

XML-файл:

<root>
   <items>
      <item id="9" name="111111111111" description="111111245" views="1"  galleryID="0" />
   </items>
</root>

Код повторителя:

<asp:Repeater ID="rptrGalleries" runat="server">
   <ItemTemplate>
      <a href='Page?id=<%#DataBinder.Eval(Container.DataItem, "id") %>'><%#DataBinder.Eval(Container.DataItem, "name") %></a>
   </ItemTemplate>
</asp:Repeater>

Codebehind:

XDocument doc = XDocument.Load(Server.MapPath("~/xml/gallery.xml"));

        IEnumerable<XElement> items = from item in doc.Descendants("item")
                                      orderby Convert.ToDateTime(item.Attribute("lastChanges").Value) descending
                    where int.Parse(item.Attribute("galleryID").Value) == 0 && bool.Parse(item.Attribute("visible").Value) != false
                    select item;
        DataSet ds = new DataSet();
        ds.ReadXml(new StringReader(doc.ToString()));

        rptrGalleries.DataSource = ds;
        rptrGalleries.DataBind();

Когда я компилирую сайт, я получаю эту ошибку:

System.Web.HttpException: DataBinding: 'System.Data.DataRowView' does not contain a property with the name 'id'.

1 Ответ

1 голос
/ 09 июня 2010

Создайте свой ретранслятор так:

<asp:Repeater ID="rptTest" runat="server" OnItemDataBound="rptTest_ItemDataBound">
    <ItemTemplate>
        <asp:HyperLink ID="lnkTest" runat="server" />
    </ItemTemplate>
</asp:Repeater>

Свяжите свой ретранслятор с объектом IEnumerable<XElements> items.

   XDocument doc = XDocument.Load(Server.MapPath("~/xml/gallery.xml")); 
            IEnumerable<XElement> items = from item in doc.Descendants("item")
                                          orderby Convert.ToDateTime(item.Attribute("lastChanges").Value) descending
                                          where int.Parse(item.Attribute("galleryID").Value) == 0 && bool.Parse(item.Attribute("visible").Value) != false
                                          select item;

            rptTest.DataSource = items;
            rptTest.DataBind();

А затем привяжите данные OnItemDataBound в коде, подобном следующему:

void rptTest_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    XElement item = (XElement)e.Item.DataItem;
    HyperLink lnkTest = (HyperLink)e.Item.FindControl("lnkTest");
    lnkTest.NavigateUrl = "Page?id=" + item.Attribute("id").Value;
    lnkTest.Text = item.Attribute("name").Value;
}

Вот как я это сделаюЯ обнаружил, что у меня намного больше контроля над OnItemDataBound, чем при попытке передать данные непосредственно на страницу ASP.Net.

...