asp.net数据源实例化类

时间:2009-10-30 14:43:36

标签: asp.net data-binding

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

ClassName:ClassName StaticMethod:StaticMethod(ParamName) 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>

所以,这只返回readonly集合对象,而不是我想要的每个项目。 这是否可能没有实际代码来实例化对象?

1 个答案:

答案 0 :(得分:0)

如果您只关心在集合中显示数据,您可以添加另一个静态方法,该方法返回您的对象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();
    }
}