【问题标题】:asp.net datasource instantiate classasp.net 数据源实例化类
【发布时间】:2009-10-30 14:43:36
【问题描述】:

我有一个静态方法,它接受一个参数并返回一个类。该类有一个 ReadOnlyCollection 属性,我想在 asp:repeater 中显示该属性。有没有办法使用 LinqDataSource 或 ObjectDataSource 来做到这一点?我与 ObjectDataSource 非常接近,但由于该方法返回单个类对象,我无法让我的中继器绑定到属性。这就是我所做的:

类名:类名 静态方法:静态方法(参数名称) ReadOnlyCollection: ClassName.Collection

<asp:objectdatasource 
  runat="server" 
  id="myData"
  selectmethod="StaticMethod"
  typename="ClassName"
>
  <selectparameters>
    <asp:parameter name="ParamName" defaultvalue="Value" />
  </selectparameters>
</asp:objectdatasource>

<asp:repeater runat="server" datasourceid="myData">
  <itemtemplate>
    <%# Container.DataItem %>
  </itemtemplate>
</asp:repeater>

因此,这仅返回只读集合对象,而不是我想要的每个项目。 如果没有实际代码来实例化对象,这是否可能?

【问题讨论】:

    标签: asp.net data-binding


    【解决方案1】:

    如果您只关心在集合中显示数据,您可以添加另一个静态方法来返回您的对象 ReadOnlyCollection 并绑定到该方法。或者,您可以放弃 ObjectDataSource 并在代码中执行此操作,例如:

        var myObj = ClassName.StaticMethod(someParam);
        MyRepeater.DataSource = myObj.Collection;
        MyRepeater.DataBind();
    

    如果你需要在你的类和集合中同时显示数据,那么你可以添加另一个Repeater到ItemTemplate:

    <asp:objectdatasource runat="server" id="myData" 
     selectmethod="StaticMethod" typename="ClassName">
        <selectparameters>
            <asp:parameter name="ParamName" defaultvalue="Value" />
        </selectparameters>
    </asp:objectdatasource>
    
    <asp:Repeater runat="server" datasourceid="myData" OnItemDataBound="Rep_ItemDataBound">
        <ItemTemplate>
            <%# Eval("SomeProperty") %>
            <ul>
                <asp:Repeater id="RepCollection" runat="server">
                    <ItemTemplate>
                        <li><%# Eval("SomeCollectionProperty") %></li>
                    </ItemTemplate>
                </asp:Repeater>
            </ul>
        </ItemTemplate>
    </asp:Repeater>
    

    ItemDataBound 方法类似于:

    protected void Rep_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item)
        {
            var dataItem = (ClassName)e.Item.DataItem;
            var innerRepeater = (Repeater)e.Item.FindControl("RepCollection");
            innerRepeater.DataSource = dataItem.Collection;
            innerRepeater.DataBind();
        }
    }
    

    【讨论】:

    • 好吧,我也需要 ClassName 对象的数据...有没有办法根据现有数据源的属性创建另一个数据源?
    • 您可以很容易地嵌套中继器。所以你可以做的是为你的 ReadOnlyCollection 添加一个子中继器,然后在外部控件“ItemDataBound”事件中以编程方式绑定到它。
    猜你喜欢
    • 1970-01-01
    • 2011-10-29
    • 2012-03-24
    • 1970-01-01
    • 2022-10-04
    • 2021-09-10
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    相关资源
    最近更新 更多