Open an EPiServer page

Here are a few ways to retrieve data for a given page (expressed in a PageReference instance) in EPiServer:

PageReference pageref = ...;
PageData pagedata;

// In a page (which is a sub-class of PageBase, e.g. TemplatePage, EditPage, SimplePage)
pagedata = this.Getpage(pageref);

// In a user control (which is a sub-class of UserControlBase)
pagedata = this.Getpage(pageref);

// Anywhere
pagedata = Global.EPDataFactory.GetPage(pageref);

Global.EPDataFactory also has some other useful functions:

// Open a page from a given FriendlyUrl rather than a PageReference
// (which requires knowing the Page ID)
pagedata = Global.EPDataFactory.GetPageByURL("/Bokningsbara-kurser/");

BTW, it’s also possible to initialize a PageReference with a Url (although NOT a Friendly Url):

pageref = PageReference.ParseUrl("http://localhost:8889/shop/Puff.aspx?id=130");

UPDATE (2007-06-04):

If you have a so called “simple address” such as “/foo”, then none of the above will work. In that case you have to use code such as this:

PropertyCriteriaCollection critcol = new PropertyCriteriaCollection();

PropertyCriteria crit = new PropertyCriteria();
crit.Condition = EPiServer.Filters.CompareCondition.Equal;
crit.Name = "PageExternalURL";
crit.Type = PropertyDataType.String;
crit.Value = simple_address.Trim(new char[] { '/' }); // Remove initial "/"
critcol.Add(crit);

PageDataCollection pagecol = Global.EPDataFactory.FindPagesWithCriteria(Global.EPConfig.RootPage, critcol);
if (pagecol.Count > 0)
{
   return pagecol[0].LinkURL;
}

Get URL from an EPiServer PageReference

Retrieving the URL to an EPiServer page seems like a basic thing to do, but it’s not quite obvious…

Referring to a page is normally represented by an instance of the PageReference class, so obviously that contains a public property called Url or something, right?

Wrong!

Instead, this is how to do it (as a bonus I also show how to retrieve the PageReference from a page property):

string url = "";
PropertyData pd = CurrentPage.Property["Shop_CartPage"];
if (pd != null && pd.IsNull == false)
{
	PageReference pageref = (PageReference)pd.Value;
	url = GetPage(pageref).LinkURL;
}

If anyone knows better or more efficient ways to do this, please add a comment to this post 🙂

Pages without page types in EPiServer

When creating “normal” ASPX pages (i.e. pages that are not EPiServer page types) to use in EPiServer sites it can be very useful to have them inherit from TemplatePage or SimplePage (both are EPiServer types) so that dynamic properties can be read, page methods called, etc. Unfortunately this will give rise to an error message similar to this:

The current template "/shop/Varukorg.aspx" does not match the specified page type file "/default.aspx"

This is because TemplatePage and SimplePage assumes that they are part of an EPiServer page type. This problem can be fixed by overriding ValidatePageTemplate() with an empty implementation:

public override void ValidatePageTemplate()
{
}

Voilá! No more error message.

BTW, try finding this information in the EPiServer docs. Not so easy…

User Controls in EPiServer

This is my first post about EPiServer, which basically is a framework for building web sites. It’s very capable and extensible and is in wide use in Scandinavia. For more information, look here: http://www.episerver.com.

Web User Controls in EPiServer solutions should always inherit from EPiServer.UserControlBase rather than the usual System.Web.UI.UserControl. This gives access to useful functions and properties such as

  • PageData GetPage(PageReference pageLink)
  • PageData CurrentPage
  • string Translate(string key)

Note that those functions work even if the current page is not a “proper” page type in EPiServer so it’s missing from the page hierarchy. Very useful!

Refresh Visual Studio Add-in settings

Here are some steps to try if you’re having problems with addins in Visual Studio (for example if toolbars or menus have vanished, or have been duplicated).

First, close all Visual Studio instances.

Then open a command line console with Visual Studio settings (e.g. “Visual Studio 2005 Command Prompt” from the start menu) and type:

devenv /resetaddin *

That line will clear the settings for all addins and cause them to refresh menus and toolbars the next time Visual Studio is started. To do that with an individual add-in, which requires knowing its class name, including namespace, type

devenv /resetaddin CodeAssist.Connect

If the above does not help, then try this (NOTE: This will delete all customization done to Visual Studio, such as keyboard mappings, etc!):

devenv /resetsettings
devenv /resetaddin *

When starting Visual Studio, you should now face a fresh and clean environment.

Retrieve data from a database

Nothing advanced here, I just wanted to store this code snippet somewhere for easy reuse…

SqlConnection conn = new SqlConnection(@"...");
SqlCommand cmd = new SqlCommand("select * from employee", conn);
cmd.CommandType = CommandType.Text;

using (conn)
{
	conn.Open();
	SqlDataReader reader = cmd.ExecuteReader();
	while (reader.Read())
	{
		...
	}
}

How to create a transparent GIF with GIMP

The GIMP is a great, free image manipulation program. It can do a lot but it’s not always obvious how it can perform a certain task.

For example, creating a transparent GIF was something I could not find how to do. Luckily, there are other bloggers out there to help:

The Gimp: Making Colors in a GIF Transparent (A.P. Lawrence).

Good tip and it works great.