代码之家  ›  专栏  ›  技术社区  ›  Rob

ASP.NET数据源实例化类

  •  0
  • Rob  · 技术社区  · 15 年前

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

    类名:classname staticMethod:staticMethod(参数名) 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 回复  |  直到 15 年前
        1
  •  0
  •   richeym    15 年前

    如果只关心在集合中显示数据,则可以添加另一个静态方法,该方法返回对象readonlycollection并绑定到该对象。或者,您可以丢弃objectdatasource并在代码中执行它,例如:

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

    如果需要在类和集合中同时显示数据,则可以向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();
        }
    }