This post is on the older side and its content may be out of date.
Be sure to visit our blogs homepage for our latest news, updates and information.
In Sitefinity CMS we have a built in ability to modify any control ascx template from the backend, but to implement some custom code-behind logic, we will have to add new web control to our Sitefinity project with Visual Studio.
The main ascx template difference between single item and list view item is the wrapping control – DynamicDetailContainer for single item and RadListView for list view.
Here is how to reach single item template:
Go to Visual Studio and create a Web User Control. Visual Studio will automatically create a template with code behind file. Copy the template code in Visual Studio ascx file, but leave the first line as it contains reference for code behind file:
<%@ Register Assembly="Telerik.Sitefinity" Namespace="Telerik.Sitefinity.DynamicModules.Web.UI.Frontend" TagPrefix="sf" %>
<%@ Register Assembly="Telerik.Sitefinity" Namespace="Telerik.Sitefinity.Web.UI.Fields" TagPrefix="sf" %>
<%@ Register Assembly="Telerik.Sitefinity" Namespace="Telerik.Sitefinity.Web.UI" TagPrefix="sf" %>
<
sf:DynamicDetailContainer
id
=
"detailContainer"
runat
=
"server"
>
<
LayoutTemplate
>
<
div
class
=
"sfitemDetails"
>
<
sf:SitefinityLabel
ID
=
"mainShortTextFieldLiteral"
runat
=
"server"
Text='<%# Eval("Title") %>' WrapperTagName="h1" HideIfNoText="true" CssClass="sfitemTitle" />
<
sf:FieldListView
ID
=
"PublicationDate"
runat
=
"server"
Format
=
"{PublicationDate.ToLocal():MMM d, yyyy, HH:mm tt}"
WrapperTagName
=
"div"
WrapperTagCssClass
=
"sfitemPublicationDate"
/>
</
div
>
<
div
>
<%--somecontrol here...--%>
</
div
>
</
LayoutTemplate
>
</
sf:DynamicDetailContainer
>
<
asp:PlaceHolder
ID
=
"socialOptionsContainer"
runat
=
"server"
></
asp:PlaceHolder
>
protected
void
Page_Load(
object
sender, EventArgs e)
{
//attach to the databound event of the container that wraps the whole control
var repeater = (DynamicDetailContainer)
this
.FindControl(
"detailContainer"
);
repeater.DataBound +=
new
EventHandler(repeater_DataBound);
}
void
repeater_DataBound(
object
sender, EventArgs e)
{
//find certain control from the controls collection of the template
var getControl =
this
.FindControl(
"detailContainer"
).Controls[0].FindControl(
"somecontrol"
);
}
As mentioned above for a single item, go to Visual Studio and create a Web User Control:
<%@ Register TagPrefix="sf" Namespace="Telerik.Sitefinity.Web.UI.PublicControls.BrowseAndEdit" Assembly="Telerik.Sitefinity" %>
<%@ Register TagPrefix="sf" Namespace="Telerik.Sitefinity.Web.UI.ContentUI" Assembly="Telerik.Sitefinity" %>
<%@ Register TagPrefix="sf" Namespace="Telerik.Sitefinity.Web.UI.Comments" Assembly="Telerik.Sitefinity" %>
<%@ Register TagPrefix="sf" Namespace="Telerik.Sitefinity.Web.UI.Fields" Assembly="Telerik.Sitefinity" %>
<%@ Register TagPrefix="sf" Namespace="Telerik.Sitefinity.Web.UI" Assembly="Telerik.Sitefinity" %>
<%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %>
<
telerik:RadListView
ID
=
"dynamicContentListView"
ItemPlaceholderID
=
"ItemsContainer"
runat
=
"server"
EnableEmbeddedSkins
=
"false"
EnableEmbeddedBaseStylesheet
=
"false"
>
<
LayoutTemplate
>
<
ul
class
=
"sfitemsList sfitemsListTitleDateTmb"
>
<
asp:PlaceHolder
ID
=
"ItemsContainer"
runat
=
"server"
/>
</
ul
>
</
LayoutTemplate
>
<
ItemTemplate
>
<
li
class
=
"sfitem sfClearfix"
>
<
h2
class
=
"sfitemTitle"
>
<
sf:DetailsViewHyperLink
ID
=
"DetailsViewHyperLink"
TextDataField
=
"Title"
runat
=
"server"
/>
</
h2
>
<
sf:FieldListView
ID
=
"PublicationDate"
runat
=
"server"
Format
=
"{PublicationDate.ToLocal():MMM d, yyyy, HH:mm tt}"
WrapperTagName
=
"div"
WrapperTagCssClass
=
"sfitemPublicationDate"
/>
<%--Add some control (in this case a Repeater)--%>
<
asp:Repeater
ID
=
"RepeaterControl"
runat
=
"server"
>
<
ItemTemplate
> </
ItemTemplate
>
</
asp:Repeater
>
</
li
>
</
ItemTemplate
>
</
telerik:RadListView
>
<
sf:Pager
id
=
"pager"
runat
=
"server"
></
sf:Pager
>
<
asp:PlaceHolder
ID
=
"socialOptionsContainer"
runat
=
"server"
></
asp:PlaceHolder
>
Now in the code behind we need to subscribe to the ItemDataBound event of the RadListView which is the control that wraps all fields that are rendered:
protected
void
Page_Load(
object
sender, EventArgs e)
{
var repeater = (RadListView)
this
.FindControl(
"dynamicContentListView"
);
repeater.ItemDataBound += repeater_ItemDataBound;
}
void
repeater_ItemDataBound(
object
sender, RadListViewItemEventArgs e)
{
if
(e.Item.ItemType == RadListViewItemType.DataItem || e.Item.ItemType == RadListViewItemType.AlternatingItem)
{
//geting the controls on the template from event args as below
var dataItem = e.Item
as
RadListViewDataItem;
if
(dataItem.DataItem !=
null
)
{
var item = dataItem.DataItem
as
DynamicContent;
if
(item !=
null
)
{
var detailLink = e.Item.FindControl(
"DetailsViewHyperLink"
)
as
DetailsViewHyperLink;
var repeat = e.Item.FindControl(
"RepeaterControl"
)
as
Repeater;
}
}
}
}
Here you can download single item sample.
Subscribe to get all the news, info and tutorials you need to build better business apps and sites