2011-12-07 42 views
1

我有一個XmlDataSouce與電影和演員。我想列出每個電影與指定的演員。我正在使用ListView控件與ClientIDMode="Predictable"ClientIDRowSuffix以確保我最終可以在我的JavaScript中使用的ID。

我有以下XmlDataSource如何在使用XmlDataSource時在嵌套ListView上設置ClientIDRowSuffix?

<asp:XmlDataSource ID="XmlDataSource1" runat="server"> 
    <Data> 
     <Movies> 
      <Movie Name="What Dreams May Come" Ranking="7" MovieId="6546" > 
       <Actor FullName="Robin Williams" ActorId="1573" /> 
       <Actor FullName="Cuba Gooding" ActorId="1957" /> 
      </Movie> 
      <Movie Name="A Beautiful Mind" Ranking="10" MovieId="5151" > 
       <Actor FullName="Russell Crowe" ActorId="1231" /> 
       <Actor FullName="Ed Harris " ActorId="1923" /> 
      </Movie> 
     </Movies> 
    </Data> 
</asp:XmlDataSource> 

現在我想查看:

<asp:ListView ID="ListView1" runat="server" ClientIDMode="Predictable" 
        ClientIDRowSuffix="MovieId" DataSourceID="XmlDataSource1"> 
    <ItemTemplate> 
     <div id="item" runat="server" clientidmode="Predictable"> 
      Name: <asp:Label ID="lblName" runat="server" Text='<%# Eval("Name") %>' /><br /> 
      Actors: 
      <asp:ListView ID="Actors" runat="server" 
          ClientIDMode="Predictable" ClientIDRowSuffix="ActorId" 
          DataSource='<%# XPathSelect("Actor") %>' /> 
       <ItemTemplate> 
         <asp:Label ID="lblActorName" runat="server" 
            Text='<%# XPath("@FullName") %>' /> 
       </ItemTemplate> 
       <LayoutTemplate> 
         <asp:PlaceHolder id="itemPlaceholder" runat="server" /> 
       </LayoutTemplate> 
       <ItemSeparatorTemplate>,</ItemSeparatorTemplate> 
      </asp:ListView> 
      <br /><br /> 
     </div> 
    </ItemTemplate> 
    <LayoutTemplate> 
     <asp:PlaceHolder id="itemPlaceholder" runat="server" /> 
    </LayoutTemplate> 
</asp:ListView> 

它看起來很棒,但它拋出以下異常:

數據綁定:'System.Xml.XmlElement'不包含名稱爲'ActorId'的 屬性。

我該如何設置正確的ClientIDRowSuffix

註釋非常感謝。

Ps。我用<%# Eval() %>,但那個綁定到電影記錄。

+0

你有沒有試過「@ActorId」? –

+0

@HenkHolterman:是的,我嘗試過。它會拋出相同的異常,'不包含名稱爲'@ActorId'的屬性 –

回答

0

我有一個答案,但你不會喜歡它,因爲它涉及到一段自定義代碼。看起來ClientIdRowSuffix需要一個屬性,所以我創建了我自己的方法。此方法需要節點集和id屬性的名稱。

<script runat="server"> 

    public IEnumerable EvalIDNode(IEnumerable element, string idAttribute) 
    { 
     foreach (System.Xml.XmlElement node in element) 
     { 
      yield return new CustomNode(node, idAttribute); 
     } 
    } 

    public class CustomNode : System.Xml.XPath.IXPathNavigable 
    { 
     private System.Xml.XmlElement _node; 

     public string IDField { get; private set; } 

     public CustomNode(System.Xml.XmlElement node, string idAttribute) 
     { 
      _node = node; 
      IDField = node.Attributes[idAttribute].Value; 
     } 

     public System.Xml.XPath.XPathNavigator CreateNavigator() 
     { 
      return _node.CreateNavigator(); 
     } 
    } 

</script> 

我們將使用的方法來獲得對ListField數據源:

<asp:ListView 
      ID="Actors" 
      runat="server" 
      ClientIDMode="Predictable" 
      ClientIDRowSuffix="IDField" 
      DataSource='<%# EvalIDNode(XPathSelect("Actor"), "ActorId") %>'> 

通知的ClientIdRowSuffix它設置爲IDField。這並不美觀,但它完成了工作。如果您使用文本框和雙向綁定,我不確定綁定是否順利。

相關問題