by Pieter Brinkman
3. June 2009 07:32
By default it is not possible to use the ViewState within methods of a ObjectDataSource. Because the DataSource doesn't run within the current page instance, it just fires the method that you specified.
You can set the page instance for the DataSourceby setting the ObjectInstance property in the ObjectCreating event of the DataSource.
[code:html]
<asp:ObjectDataSource ID="odsListing" runat="server" SelectMethod="getItems" TypeName="YOUR.NAMESPACE" OnObjectCreating="ObjectDataSource_ObjectCreating" DataObjectTypeName="List<Item>">
[/code]
protected void ObjectDataSource_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
{
e.ObjectInstance = this;
}
Now you can use the ViewState in you DataSourceMethod (getItems() in this example).
by Pieter Brinkman
8. April 2009 05:22
For a new project I started working with Sitecore again.
I needed to create a listing of items with paging. I implemented a Listview with a ObjectDataSource and the DataPager control.
<asp:ListView ID="lvListing" runat="server" DataSourceID="odsListing" onitemdatabound="lvListing_ItemDataBound">
<ItemTemplate>
<li class="clearfix">
<a class="thumb" ID="thumnailLink" runat="server" >
<sc:Image Field="Thumbnail" ID="thumbnailImage" MaxWidth="120" runat="server" />
</a>
<h2><asp:HyperLink runat="server" ID="hlTitle" /></a></h2>
<span class="date"> <sc:Date ID="listingDate" runat="server" Format="dd-MM-yyyy" /> <asp:Literal Visible="false" runat="server" ID="litDateField" /></span>
<%# Eval("Fields[\"IntroText\"]") %>
<asp:HyperLink runat="server" CssClass="url" ID="hlNavigationUrl" />
</li>
</ItemTemplate>
<EmptyDataTemplate>
Geen artikelen
</EmptyDataTemplate>
<LayoutTemplate>
<ul ID="itemPlaceholderContainer" runat="server" style="">
<li ID="itemPlaceholder" runat="server" />
</ul>
</LayoutTemplate>
<ItemSeparatorTemplate>
<br />
</ItemSeparatorTemplate>
</asp:ListView>
<ul>
<li class="paging">
<asp:DataPager ID="DataPager1" PagedControlID="lvListing" runat="server" PageSize="10" >
<Fields>
<asp:nextpreviouspagerfield ButtonCssClass="paging-previous" PreviousPageText="Vorige" ButtonType="Link" ShowPreviousPageButton="True" ShowNextPageButton="False"/>
<asp:nextpreviouspagerfield ButtonCssClass="paging-next" NextPageText="Volgende" ButtonType="Link" ShowPreviousPageButton="False" ShowNextPageButton="True" />
<asp:NumericPagerField ButtonType="Link" NextPageText="VOLGENDE" PreviousPageText="VORIGE" RenderNonBreakingSpacesBetweenControls="true" />
</Fields>
</asp:DataPager>
</li>
</ul>
<asp:ObjectDataSource ID="odsListing" runat="server" SelectMethod="GetItems"
TypeName="MyNameSpace.MyUsercontrol"
DataObjectTypeName="Sitecore.Collections.ChildList">
</asp:ObjectDataSource>
In the code behind I created the public method GetItems which returns a ChildListCollection.
namespace MyNameSpace
{
public partial class MyUsercontrol: System.Web.UI.UserControl
{
public Sitecore.Collections.ChildList GetItems()
{
return Sitecore.Context.Item.GetChildren();
}
}
}
The PagedControlID property of the datapager control is set to the ID of the Listview.