【问题标题】:Asp.net UserControl - How to Data-Bind objects from a list?Asp.net UserControl - 如何从列表中绑定对象?
【发布时间】:2015-02-07 02:14:10
【问题描述】:

我正在使用 asp.net 4.5 c#。 我创建了一个用户控件,其中包含以下成员:

  [Bindable(true)]
    public Product item
    {
        get{
            return _product;
        }
        set
        {
            _product = value;
        }

    }

然后我使用我的控件,同时将“产品”DataBinding 到上面的成员中:

  <script runat="server">
Product item=new Product();
            </script>  
                    <uc:productBox runat="server" item="<%#item%>"/>      

虽然这可行,但尝试通过以下方式绑定列表中的动态项目会失败:

  foreach (Product item in ProductList()){%>          
                    <uc:productBox runat="server" item="<%#item%>"/>       
            <%}%>

我收到以下错误:

当前上下文中不存在名称“item”

为什么我不能绑定列表中的项目,我该如何解决这个问题才能正常工作?

【问题讨论】:

    标签: c# asp.net data-binding user-controls bindable


    【解决方案1】:

    绑定表达式只能从任何可见的地方访问类范围内的变量或静态成员,而不是任何循环的范围,因为循环将在实际代码中的自己的范围内执行。

    您应该使用 Placeholder 并将其填充到后面的代码中,或者(甚至更好)use the Repeater control 获取您的 ProductList 并构建您的 productBoxes。

    因此,在您的RepeaterItemTemplate 中,您应该将您的ProductBox 并在您的Item 属性上使用&lt;%# (Product)Container.DataItem %&gt; 表达式,例如binding a simple list to a Repeater

    一个小提示:在 ASPX 中构建 foreach 写得不是很好。永远不要那样做。此外,名称约定坚持以类/控件/公共成员名称的大写字母开头。

    【讨论】:

    • 谢谢。我按照你的建议做了,我现在有一个名为“ProductsArea”的中继器,我使用 ProductsArea.DataSource = Products; ProductsArea.DataBind();在后面的代码中,在前面我使用:。但是 Item 在我的控制中始终为空。为什么会这样。
    • @Programer 我自己从来没有使用过Repeater 控件。如何将RepeaterItemType 设置为Product 的完整命名空间+ 类型,然后使用&lt;%# Item %&gt;,如下所示:stackoverflow.com/a/17328960/1540350 希望这可行。或尝试&lt;%= this.GetDataItem().ToString() %&gt;。请在这里尝试所有答案:stackoverflow.com/questions/5011617/… 并给我反馈什么有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 2014-01-15
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    相关资源
    最近更新 更多