C# 使用XmlDataSource时,如何在嵌套的ListView上设置ClientDrowSuffix?

C# 使用XmlDataSource时,如何在嵌套的ListView上设置ClientDrowSuffix?,c#,asp.net,xpath,datasource,asp.net-4.0,C#,Asp.net,Xpath,Datasource,Asp.net 4.0,我有一个电影和演员的XmlDataSouce。我想列出每部电影的演员名单。我正在使用ListView控件和ClientIDMode=“Predictable”和ClientIDRowSuffix来确保最终得到可以在javascript中使用的ID。 我有以下XmlDataSource: <asp:XmlDataSource ID="XmlDataSource1" runat="server"> <Data> <Movies>

我有一个电影和演员的
XmlDataSouce
。我想列出每部电影的演员名单。我正在使用
ListView
控件和
ClientIDMode=“Predictable”
ClientIDRowSuffix
来确保最终得到可以在javascript中使用的ID。

我有以下
XmlDataSource

<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

非常感谢您的评论


注:我使用了
,但那一个绑定到电影记录。

我有一个答案,但你不会喜欢它,因为它涉及一段自定义代码。似乎
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>

请注意
ClientIdRowSuffix
设置为IDField。这并不漂亮,但它完成了任务。如果您使用文本框和双向绑定,我不确定绑定是否顺利。

我有一个答案,但您不会喜欢它,因为它涉及一段自定义代码。似乎
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>

请注意
ClientIdRowSuffix
设置为IDField。这并不漂亮,但它完成了任务。如果您使用文本框和双向绑定,我不确定绑定是否正常。

@HenkHolterman:是的,我试过了。它抛出了相同的异常,“不包含名为“@ActorId”的属性@HenkHolterman:是的,我试过了。它引发相同的异常,“不包含名为“@ActorId”的属性”