2010-05-23 31 views
1

我想將Repeater控件綁定到充滿XML數據的數據集,但我不知道如何在Repeater中顯示屬性。數據集中的xml attribure

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> 

代碼隱藏:

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'. 
+0

儘管我在下面提供了一種替代方法,但我認爲問題在於如何在此處構建數據集。另外,當你根本不使用結果時,爲什麼你甚至會調用linq查詢來填充項目? – CkH 2010-06-09 16:17:14

回答

1

像這樣創建您的中繼器:

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

綁定你的中繼到IEnumerable<XElements>項目對象。

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頁面。