Заполнить DropDownList из XmlDataSource

2

Я хотел бы заполнить свой DropDownList с помощью простого XML файла:

<?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>

Как извлечь текст?

Спасибо

Теги:
xpath
drop-down-menu

3 ответа

7
Лучший ответ

Я не могу вспомнить это с самого начала, но я думаю, что в 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 вместо прямого использования значения node.

Если вы не можете изменить структуру исходного файла XML, вы можете применить к нему преобразование XSLT, используя свойство TransformFile как описанный в этом сообщении .

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.

-1

Вот один из способов сделать это: вы можете спроектировать массив ListItems в запросе LINQ:

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()
);
  • 0
    спасибо, но я хочу "Заполнить DropDownList из XmlDataSource"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню