Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

ASP.NET Custom Control to Create Google Calendar Event Hyperlinks

0.00/5 (No votes)
13 Apr 2006 1  
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

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here