从XmlDataSource填充DropDownList

时间:2009-03-10 17:16:40

标签: c# asp.net xpath drop-down-menu

我想使用一个简单的xml文件填充我的DropDownList:

<?xml version="1.0" encoding="utf-8" ?>
<Databases>
  <Database>foo</Database>
  <Database>bar</Database>
  <Database>baz</Database>
</Databases>

我的XPath是

/Databases/Database

我的下拉列表呈现为:

<select name="databaseDropDownList" id="databaseDropDownList"> 
                    <option selected="selected" value="System.Web.UI.WebControls.XmlDataSourceNodeDescriptor">System.Web.UI.WebControls.XmlDataSourceNodeDescriptor</option>
                    <option value="System.Web.UI.WebControls.XmlDataSourceNodeDescriptor">System.Web.UI.WebControls.XmlDataSourceNodeDescriptor</option>
                    <option value="System.Web.UI.WebControls.XmlDataSourceNodeDescriptor">System.Web.UI.WebControls.XmlDataSourceNodeDescriptor</option>
</select>

我该如何提取文字?

由于

3 个答案:

答案 0 :(得分:8)

我无法从脑海中回想起它,但我认为XmlDataSource中存在一个错误,它阻止您绑定到xml节点的值。它仅适用于属性。如果我错了,请纠正我。您需要对XML文件进行一些修改:

<%@ Page Language="C#" %>
<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            string xml =
@"<?xml version=""1.0"" encoding=""utf-8"" ?>
<Databases>
  <Database name=""foo"" />
  <Database name=""bar"" />
  <Database name=""baz"" />
</Databases>";
            databasesSource.Data = xml;
            databasesSource.DataBind();
        }
    }
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:DropDownList ID="databases" runat="server" DataSourceID="databasesSource" DataValueField="name" DataTextField="name" />
        <asp:XmlDataSource ID="databasesSource" runat="server" XPath="/Databases/Database" />
    </div>
    </form>
</body>
</html>

请注意,我添加了 name 属性,而不是直接使用节点的值。

如果您无法修改原始XML文件的结构,则可以使用TransformFile属性中所述的post属性对其应用XSLT转换。

答案 1 :(得分:3)

我今天遇到了同样的问题。我的解决方案:

这是我的xml:

<?xml version="1.0" encoding="utf-8"?>

<pokemons>
  <pokemon>
    <nome itemname="bulbassaur">bulbassaur </nome>
  </pokemon>
  <pokemon>
    <nome itemname="charmander">chamander </nome>
  </pokemon>
  <pokemon>
    <nome itemname="squirtle"> squirtle </nome>
  </pokemon>
</pokemons>

我将DataTextField =“itemname”放在DropDownList服务器控件上。 例如:

<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" 
            DataSourceID="XmlDataSource1" DataTextField="itemname">

它没有问题。可能不是最好的解决方案,但至少要比System.Web.UI.WebControls.XmlDataSourceNodeDescriptor好。

答案 2 :(得分:-1)

以下是一种方法 - 您可以在LINQ查询中投射ListItems数组:

XDocument doc = XDocument.Parse(@"<Databases>
        <Database>foo</Database>
        <Database>bar</Database>
        <Database>baz</Database>
    </Databases>");

YourList.Items.AddRange(
    (from XElement el in doc.Descendants("Database")
    select new ListItem(el.Value)).ToArray()
);