I’m still working on posting the Sitefinity 4.0 BETA webinar video. Due to technical issues encountered early into the webinar I lost the Gotomeeting recording. We have backup recordings, but these recordings contain Ivan Osmak & I’s individual local recordings. These two local recordings need combined into a single video. It’s going to take me some time to get this video processed. Be patient with me.
In the meantime, I’ve attached our Powerpoint slides to this blog post.
I’ve also posted Ivan’s code samples below:
~/Webinar.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Webinar.aspx.cs" Inherits="SitefinityWebApp.Webinar" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html
xmlns
=
"http://www.w3.org/1999/xhtml"
>
<
head
runat
=
"server"
>
<
title
></
title
>
</
head
>
<
body
>
<
form
id
=
"form1"
runat
=
"server"
>
<
h1
>
Fluent API - webinar examples
</
h1
>
<
h3
>
Introductory example
</
h3
>
<
p
>
<
asp:Label
ID
=
"newsItemTitleLabel"
runat
=
"server"
Text
=
"News item title:"
></
asp:Label
>
<
asp:TextBox
ID
=
"newsItemTitle"
runat
=
"server"
></
asp:TextBox
>
<
asp:Button
ID
=
"createNewsItem"
runat
=
"server"
Text
=
"Create news item"
OnClick
=
"createNewsItem_Click"
/>
</
p
>
<
h3
>Named transactions and "using() {}" syntax</
h3
>
<
p
>
<
p
>
Create 10 content items and 20 event items.
<
asp:Button
ID
=
"createContentItemsAndEvents"
runat
=
"server"
Text
=
"Create"
OnClick
=
"createContentItemsAndEvents_Click"
/>
</
p
>
</
p
>
<
h3
>Child facades</
h3
>
<
p
>
<
p
>
Create a new blog and then create a blog post in it.
<
asp:Button
ID
=
"createABlogAndBlogPost"
runat
=
"server"
Text
=
"Create"
OnClick
=
"createABlogAndBlogPost_Click"
/>
</
p
>
</
p
>
<
h3
>Three random examples</
h3
>
<
p
>
<
p
>
Create a page:
<
asp:Button
ID
=
"createAPage"
runat
=
"server"
Text
=
"Create"
OnClick
=
"createAPage_Click"
/>
</
p
>
</
p
>
<
p
>
<
p
>
Add dynamic field to an existing NewsItem type:
<
asp:Button
ID
=
"addDynamicField"
runat
=
"server"
Text
=
"Add dynamic field"
OnClick
=
"addDynamicField_Click"
/>
</
p
>
</
p
>
<
p
>
<
p
>
Create a completely new dynamic type:
<
asp:Button
ID
=
"createDynamicType"
runat
=
"server"
Text
=
"createDynamicType"
OnClick
=
"createDynamicType_Click"
/>
</
p
>
</
p
>
</
form
>
</
body
>
</
html
>
~/Webinar.aspx.cs
using System;
using Telerik.Sitefinity;
using Telerik.Sitefinity.Fluent.Pages;
using System.Web.UI.WebControls;
using Telerik.Sitefinity.Web;
using Telerik.Sitefinity.Modules.Pages;
using System.Linq;
using Telerik.Sitefinity.News.Model;
using Telerik.Sitefinity.Metadata.Model;
namespace SitefinityWebApp
{
public partial class Webinar : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void createNewsItem_Click(object sender, EventArgs e)
{
App.Prepare()
.SetPagesProvider("Mypages")
.SetTransactionName("Tran1")
.WorkWith()
.NewsItem()
.CreateNew()
.Do(ni =>
{
ni.Title = this.newsItemTitle.Text;
ni.Description = "Some description";
})
.SaveChanges();
}
protected void createContentItemsAndEvents_Click(object sender, EventArgs e)
{
using (var fluent = App.WorkWith())
{
// create 10 content items
for (int i = 0; i <
10
; i++)
{
fluent.ContentItem()
.CreateNew()
.Do(ci =>
{
ci.Title = "Content item " + i.ToString();
ci.Author = "Ivan";
});
}
// create 20 events
for (int i = 0; i <
20
; i++)
{
fluent.Event()
.CreateNew()
.Do(ev =>
{
ev.Title = "Event " + i.ToString();
ev.EventStart = DateTime.Now;
});
}
}
// all items will be committed automatically in one transaction upon the exit of the using block
}
protected void createABlogAndBlogPost_Click(object sender, EventArgs e)
{
App.WorkWith()
.Blog()
.CreateNew()
.Do(b =>
{
b.Title = "Our test blog";
b.UrlName = "our-test-blog";
})
.BlogPost()
.CreateNew()
.Do(bp => bp.Title = "First blog post")
.Done()
.Do(b => b.Description = "Forgot to add the blog description")
.SaveChanges();
}
protected void createAPage_Click(object sender, EventArgs e)
{
App.WorkWith()
.Page()
.CreateNewStandardPage(PageLocation.Frontend)
.Do(pn =>
{
pn.Title = "My Page";
pn.UrlName = "my-page";
})
.SaveChanges();
SiteMapBase.Cache.Flush();
}
protected void addDynamicField_Click(object sender, EventArgs e)
{
App.WorkWith()
.DynamicData()
.Type(typeof(NewsItem))
.Field()
.TryCreateNew("ResearcherName", typeof(string))
.SaveChanges(true);
}
protected void createDynamicType_Click(object sender, EventArgs e)
{
App.WorkWith()
.DynamicData()
.Type()
.CreateNew("ContactInfo", "Telerik.Sitefinity.DynamicTypes.Model")
.Do(dt => dt.DatabaseInheritance = DatabaseInheritanceType.vertical)
.Field()
.CreateNew("FirstName", typeof(string))
.Done()
.Field()
.CreateNew("LastName", typeof(string))
.Done()
.Field()
.CreateNew("Age", typeof(int))
.Done()
.SaveChanges(true);
}
}
}
This code uses features that are found in the upcoming BETA. Consequently, it’s unlikely this code will work with the CTP release of Sitefinity 4.0. If you’re interested, you’ll get a chance to play with the Fluent API next week.