1

我有一个 ASP.NET 中继器正在加载要购买的衬衫。数据存储在一个 XML 文件中,我有可用的衬衫尺寸以逗号分隔格式,所以一件衬衫是 S、M、L,另一件是 S、M、L、XL。

由于我使用中继器,我试图执行以下操作:

<asp:DropDownList ID="ddlSize" runat="server">
  <asp:ListItem Text="Choose" />
</asp:DropDownList>

<% For Each s As String In XPath("Sizes").Split(",")
  Me.ddlSize.Items.Add(New ListItem(s, s))
Next %>

我收到 ddlSize 不是页面成员的错误,所以我认为下拉列表不在范围内?无论如何,在转发器中生成列表项的最佳方法是什么?谢谢!

编辑 1 - 根据评论,我的 XML 结构如下:

<product>
    <name>Golf Shirt</name>
    <description>Nike branded</description>
    <cost>49.99</cost>
    <sizes>S,M,L,XL</sizes>
</product>
4

2 回答 2

0

这是您需要做的。将此添加到您的代码后面。假设您使用的是 c#,但如果不是,您可以轻松地将其转换(只需 google c# 到 vb)。我不会在页面中执行此操作,而是在后面的代码中执行此操作。此外,除非您使用“名称”节点,否则您的示例 xml 没有任何类型的键,顺便说一句,这是一个坏主意。我建议您考虑将 xml 更改为以下内容:

 <?xml version="1.0" encoding="utf-8" ?>
<products>
<product id="1">
  <name>Golf Shirt</name>
  <description>Nike branded</description>
  <cost>49.99</cost>
  <sizes>S,M,L,XL</sizes>
 </product>
 <product id="2">
  <name>Another Golf Shirt</name>
  <description>Ashworth branded</description>
  <cost>59.99</cost>
  <sizes>S,M,L,XL,XXL</sizes>
 </product>
</products>

下面发生的情况是,当控件加载时,它会抓取 xml 文档,然后使用您的密钥(很可能您将在产品页面上,并且它会有一些密钥,如果不使用“名称”节点但再次小心that) 选择单个节点。我们采用尺寸和修剪/替换以确保我们没有多余的空间等等。然后将字符串数组中的每个添加到下拉列表中。

  protected void ddlSize_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            // get reference to dropdown
            var ddl = (DropDownList)sender;

            // clear existing items if not it will keep appending.
            ddl.Items.Clear();

            // add default choose item.
            ddl.Items.Add(new ListItem("Choose", ""));

            // get the xml document.
            var xDoc = new XmlDocument();
            var path = Server.MapPath("~/items.xml");
            xDoc.Load(path);

            // you'll want to get this id from a param from your page or something.
            // this is because I'm assuming you'll have several products you'll need to grab
            // the product but the "name" node or an attribute as I've added called "id" or something.
            var id = 1;

            // select the sizes node based on our id as described above.
            var node = xDoc.SelectSingleNode("//product[@id='" + id + "']//sizes");

            // split to string array but trim and replace any spaces just in case.
            string[] sizes = node.InnerText.ToString().Trim().Replace(" ", "").Split(',');

            // iterate sizes and add them to the drop down.
            foreach (string s in sizes)
            {
                ddl.Items.Add(new ListItem(s, s));
            }
        }            

    }

顺便说一句,这可能看起来很多,但实际上并非如此。你可以调查一些你放在帮助类中的帮助方法/扩展,它们会清理你需要的每个下拉列表等。您也可以根据 xml doc 缓存它的大小等,但这是另一个主题。

于 2013-05-21T17:10:41.593 回答
0

建议的答案很有帮助,但最终对我的场景没有用,因为它需要重新读取数据源,然后找到一种方法来跟踪我当前尝试加载的“哪个产品”。

最后,我能够为我的列表视图使用 ItemDataBound 事件,找到我的下拉列表控件,并使用 DataBinder.Eval 函数来解析我的数据并添加项目。代码示例如下,对于任何好奇的人。

If e.Item.FindControl("ddlSize") IsNot Nothing Then
    'Get our dropdownlist
    Dim ddl As DropDownList = CType(e.Item.FindControl("ddlSize"), DropDownList)
        'Make sure we didn't already add items to this ctrl
        If ddl.Items.Count = 0 Then
            'get our sizes, which are stored in comma delimited format
            Dim sizes() As String = DataBinder.Eval(e.Item.DataItem, "Sizes").ToString.Split(",")
            'add our items
            For Each s As String In sizes
                ddl.Items.Add(New ListItem(s, s))
            Next
        End If
    End If
于 2013-05-31T18:29:02.007 回答