Как установить ClientIDRowSuffix на вложенный ListView при использовании XmlDataSource? - PullRequest
2 голосов
/ 08 декабря 2011

У меня есть XmlDataSouce с фильмами и актерами. Я хотел бы перечислить каждый фильм с указанными актерами. Я использую ListView элементы управления с ClientIDMode="Predictable" и ClientIDRowSuffix, чтобы убедиться, что у меня будут идентификаторы, которые я могу использовать в своем JavaScript.

У меня есть следующее 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?

Комментарии высоко ценятся.

Ps. Я использовал <%# Eval() %>, но он привязан к записи фильма.

1 Ответ

0 голосов
/ 09 декабря 2011

У меня есть ответ, но он вам не понравится, так как он включает в себя фрагмент пользовательского кода.Кажется, 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 .Это не красиво, но это делает работу.Я не уверен, что связывание пройдет хорошо, если вы будете использовать текстовые поля и двухстороннее связывание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...