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”的属性”