【问题标题】:How to set ClientIDRowSuffix on nested ListView when using XmlDataSource?使用 XmlDataSource 时如何在嵌套的 ListView 上设置 ClientIDRowSuffix?
【发布时间】:2011-12-07 22:09:19
【问题描述】:

我有一个 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>

看起来不错,但是会抛出以下异常:

DataBinding:“System.Xml.XmlElement”不包含具有 名称“ActorId”。

如何设置正确的ClientIDRowSuffix?

非常感谢您的评论。

附言。我用过&lt;%# Eval() %&gt;,但那个绑定到电影记录。

【问题讨论】:

  • @HenkHolterman:是的,我试过了。它抛出了同样的异常,'不包含名为'@ActorId'的属性

标签: c# asp.net xpath datasource asp.net-4.0


【解决方案1】:

我有一个答案,但你不会喜欢它,因为它涉及一段自定义代码。 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。它不漂亮,但它完成了工作。如果您使用文本框和双向绑定,我不确定绑定是否顺利。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    相关资源
    最近更新 更多