65.9K
CodeProject is changing. Read more.
Home

ASP.NET Custom Control to Create Google Calendar Event Hyperlinks

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.06/5 (6 votes)

Apr 13, 2006

CPOL
viewsIcon

118211

downloadIcon

570

An ASP.NET Custom Control to create Google Calendar Event hyperlinks.

Sample Image - GoogleCalendarEventLink.gif

Introduction

Google recently released the Google Calendar application. If your website has event information, allow users to add the event to their own Google Calendar easily with a Google Calendar event link.

Example link

What I've done is created a new ASP.NET HyperLink control, and added some properties that allow specific information to be attached to the HyperLink control for a Google Calendar Event. Then, I provided an overridden Render() function that assembles the specific NavigateUrl with the provided information, supplying defaults if necessary.

Render() code

protected override void Render(HtmlTextWriter writer)
{
    StringBuilder url = new StringBuilder();
    url.Append("http://www.google.com/calendar/event?");
    url.Append("action=TEMPLATE");

    // Event title

    string eventText = this.EventTitle;
    if (string.IsNullOrEmpty(eventText))
    {
        eventText = this.Text;
    }
    if (!string.IsNullOrEmpty(eventText))
    {
        url.AppendFormat("&text={0}", 
                         HttpUtility.UrlEncode(eventText));
    }

    // Event dates

    // TODO: Validate that a start or end date has been specified

    url.Append("&dates=");
    if (this.StartDateTime != null)
    {
        if (this.AllDayEvent || (this.StartDateTime == this.EndDateTime))
        {
            url.AppendFormat("{0}/{0}", 
                this.StartDateTime.ToString("yyyyMMdd"));
        }
        else
        {
            // TODO: Validate that EndDateTime is set,
            // because this is not an all day event

                const string UTCFORMATSTRING = "yyyyMMdd\\THHmmss\\Z";
                url.AppendFormat("{0}/{1}", 
                  this.StartDateTime.ToUniversalTime().ToString(UTCFORMATSTRING),
                  this.EndDateTime.ToUniversalTime().ToString(UTCFORMATSTRING));
            }
        }

        // TODO: Apparently on sprop is required by google,
        // so validate that one is specified
        // Organization info

        if (!string.IsNullOrEmpty(this.OrganizerName))
        {
            url.AppendFormat("&sprop=name:{0}", 
                HttpUtility.UrlEncode(this.OrganizerName));
        }
        if (!string.IsNullOrEmpty(this.OrganizerWebsite))
        {
            url.AppendFormat("&sprop=website:{0}", 
                HttpUtility.UrlEncode(this.OrganizerWebsite));
        }

        // Event location

        if (!string.IsNullOrEmpty(this.EventLocation))
        {
            url.AppendFormat("&location={0}", 
                HttpUtility.UrlEncode(this.EventLocation));
        }

        // Event description

        if (!string.IsNullOrEmpty(this.EventDescription))
        {
            url.AppendFormat("&details={0}", 
                HttpUtility.UrlEncode(this.EventDescription));
        }

        // Free/Busy
        // Only add to url if true since default false
        // and url could already be really long

        if (this.MarkAsBusy)
        {
            url.AppendFormat("&trp={0}", this.MarkAsBusy);
        }

        // Set the NavigateUrl

        this.NavigateUrl = url.ToString();
        base.Render(writer);
    }
}

This is my first stab at a server control (I usually just write user controls), so let me know if there are problems, but please be gentle :)

See also