Search code examples
vb.neticalendarresponse.write

Response .write for .ics file not allowing code to run


I have an application that I am writing that dynamically builds an .ICS file by getting data input by a user. What I am trying to do is save the data to a database then offer the .ICS file for the user to download so they can add it to their calendar. I would like all of this to happen with one button click. The problem I am running into is when the button is clicked it is writing the file so the user is able to download it but it is not storing the data to the database. It stays on the page and doesn't appear to postback.

Public Sub AddToCalendar(ByVal Src As Object, ByVal e As EventArgs)              
Try        

    Dim Subject As String = setDBText(txtSubject.text)
    Dim Comment As String = setDBText(txtComment.text)
    Dim StartDate As String = setDBDate(txtStartDate.value,txtStartTime.text)
    Dim EndDate As String = setDBDate(txtEndDate.value,txtEndTime.text)

    sqlStr = "INSERT INTO tblActivity(Subject,Comment,StartDate,EndDate) " & _
             "VALUES(" & Subject & "," & Comment & "," & StartDate & "," & EndDate &")"
    dc.CommandText = sqlStr
    dc.ExecuteNonQuery()

    lblTest.Text = "New Event Sucessfully Added"                    

    '************
    '** CREATE CODE TO BUILD ICS FILE
    '************
    Dim sbICSFile As StringBuilder = New StringBuilder()
    Dim dtNow As DateTime = DateTime.Now

    sbICSFile.AppendLine("BEGIN:VCALENDAR")
    sbICSFile.AppendLine("VERSION:2.0")
    sbICSFile.AppendLine("PRODID:-//AkonaDev/CalendarAppointment")
    sbICSFile.AppendLine("CALSCALE:GREGORIAN")
    sbICSFile.AppendLine("BEGIN:VEVENT")

    ' Define time zones.
    ' US/Eastern
    sbICSFile.AppendLine("BEGIN:VTIMEZONE")
    sbICSFile.AppendLine("TZID:US/Eastern")
    sbICSFile.AppendLine("BEGIN:STANDARD")
    sbICSFile.AppendLine("DTSTART:20071104T020000")
    sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11")
    sbICSFile.AppendLine("TZOFFSETFROM:-0400")
    sbICSFile.AppendLine("TZOFFSETTO:-0500")
    sbICSFile.AppendLine("TZNAME:EST")
    sbICSFile.AppendLine("END:STANDARD")
    sbICSFile.AppendLine("BEGIN:DAYLIGHT")
    sbICSFile.AppendLine("DTSTART:20070311T020000")
    sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3")
    sbICSFile.AppendLine("TZOFFSETFROM:-0500")
    sbICSFile.AppendLine("TZOFFSETTO:-0400")
    sbICSFile.AppendLine("TZNAME:EDT")
    sbICSFile.AppendLine("END:DAYLIGHT")
    sbICSFile.AppendLine("END:VTIMEZONE")

    ' US/Central
    sbICSFile.AppendLine("BEGIN:VTIMEZONE")
    sbICSFile.AppendLine("TZID:US/Central")
    sbICSFile.AppendLine("BEGIN:STANDARD")
    sbICSFile.AppendLine("DTSTART:20071104T020000")
    sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11")
    sbICSFile.AppendLine("TZOFFSETFROM:-0500")
    sbICSFile.AppendLine("TZOFFSETTO:-0600")
    sbICSFile.AppendLine("TZNAME:CST")
    sbICSFile.AppendLine("END:STANDARD")
    sbICSFile.AppendLine("BEGIN:DAYLIGHT")
    sbICSFile.AppendLine("DTSTART:20070311T020000")
    sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3")
    sbICSFile.AppendLine("TZOFFSETFROM:-0600")
    sbICSFile.AppendLine("TZOFFSETTO:-0500")
    sbICSFile.AppendLine("TZNAME:CDT")
    sbICSFile.AppendLine("END:DAYLIGHT")

    sbICSFile.AppendLine("END:VTIMEZONE")

    ' US/Mountain
    sbICSFile.AppendLine("BEGIN:VTIMEZONE")
    sbICSFile.AppendLine("TZID:US/Mountain")
    sbICSFile.AppendLine("BEGIN:STANDARD")
    sbICSFile.AppendLine("DTSTART:20071104T020000")
    sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11")
    sbICSFile.AppendLine("TZOFFSETFROM:-0600")
    sbICSFile.AppendLine("TZOFFSETTO:-0700")
    sbICSFile.AppendLine("TZNAME:MST")
    sbICSFile.AppendLine("END:STANDARD")
    sbICSFile.AppendLine("BEGIN:DAYLIGHT")
    sbICSFile.AppendLine("DTSTART:20070311T020000")
    sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3")
    sbICSFile.AppendLine("TZOFFSETFROM:-0700")
    sbICSFile.AppendLine("TZOFFSETTO:-0600")
    sbICSFile.AppendLine("TZNAME:MDT")
    sbICSFile.AppendLine("END:DAYLIGHT")
    sbICSFile.AppendLine("END:VTIMEZONE")

    ' US/Pacific
    sbICSFile.AppendLine("BEGIN:VTIMEZONE")
    sbICSFile.AppendLine("TZID:US/Pacific")
    sbICSFile.AppendLine("BEGIN:STANDARD")
    sbICSFile.AppendLine("DTSTART:20071104T020000")
    sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11")
    sbICSFile.AppendLine("TZOFFSETFROM:-0700")
    sbICSFile.AppendLine("TZOFFSETTO:-0800")
    sbICSFile.AppendLine("TZNAME:PST")
    sbICSFile.AppendLine("END:STANDARD")
    sbICSFile.AppendLine("BEGIN:DAYLIGHT")
    sbICSFile.AppendLine("DTSTART:20070311T020000")
    sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3")
    sbICSFile.AppendLine("TZOFFSETFROM:-0800")
    sbICSFile.AppendLine("TZOFFSETTO:-0700")
    sbICSFile.AppendLine("TZNAME:PDT")
    sbICSFile.AppendLine("END:DAYLIGHT")
    sbICSFile.AppendLine("END:VTIMEZONE")

    ' Define the event
    sbICSFile.Append("DTSTART;TZID=" + ddlStartTZ.Text + ":")
    sbICSFile.Append(CDATE(txtStartDate.value).Year.ToString())
    sbICSFile.Append( _
        FormatDateTimeValue(CDATE(txtStartDate.value).Month))
    sbICSFile.Append( _
        FormatDateTimeValue(CDATE(txtStartDate.value).Day) + "T")
    sbICSFile.AppendLine(ddlStartTime.SelectedValue)

    sbICSFile.Append("DTEND;TZID=" + ddlEndTZ.Text + ":")
    sbICSFile.Append(CDATE(txtStartDate.value).Year)
    sbICSFile.Append( _
        FormatDateTimeValue(CDATE(txtStartDate.value).Month))
    sbICSFile.Append( _
        FormatDateTimeValue(CDATE(txtStartDate.value).Day) + "T")
    sbICSFile.AppendLine(ddlEndTime.SelectedValue)

    sbICSFile.AppendLine("SUMMARY:" + txtEventSubject.Text)
    sbICSFile.AppendLine("DESCRIPTION:" + txtEventDescription.Text)
    sbICSFile.AppendLine("UID:1")
    sbICSFile.AppendLine("SEQUENCE:0")

    sbICSFile.Append("DTSTAMP:" + dtNow.Year.ToString())
    sbICSFile.Append(FormatDateTimeValue(dtNow.Month))
    sbICSFile.Append(FormatDateTimeValue(dtNow.Day) + "T")
    sbICSFile.Append(FormatDateTimeValue(dtNow.Hour))
    sbICSFile.AppendLine(FormatDateTimeValue(dtNow.Minute) + "00")

    sbICSFile.AppendLine("END:VEVENT")
    sbICSFile.AppendLine("END:VCALENDAR")    

    Response.ContentType = "text/calendar"
    Response.AddHeader("content-disposition", _
        "attachment; filename=CalendarEvent1.ics")
    Response.Write(sbICSFile)
    Response.End()

Catch exc As Exception
    lblError.text = exc.toString       

End Try

Solution

  • I found that the response can only do one of these things at a time. It cannot send a file and execute the server code. So what I did was create a separate "file download" page that handles the file download on page_load. To get the ICS file data to the file download page I created a session variable that gets filled on the button click of the submission page. Then I added an onClientClick event to the button and set it to a javascript function that opens a pop-up window to the file download page. This allowed the page to save the data to the database and display a file download prompt with a single button click.

    Submission Page

    Public Sub AddToCalendar(ByVal Src As Object, ByVal e As EventArgs)              
    Try        
    
        Dim Subject As String = setDBText(txtSubject.text)
        Dim Comment As String = setDBText(txtComment.text)
        Dim StartDate As String = setDBDate(txtStartDate.text,txtStartTime.text)
        Dim EndDate As String = setDBDate(txtEndDate.text,txtEndTime.text)
    
        sqlStr = "INSERT INTO tblActivity(Subject,Comment,StartDate,EndDate) " & _
                 "VALUES(" & Subject & "," & Comment & "," & StartDate & "," & EndDate &")" 
        dc.CommandText = sqlStr
        dc.ExecuteNonQuery()
    
        lblTest.Text = "New Event Sucessfully Added"                    
    
        '************
        '** CREATE CODE TO BUILD ICS FILE
        '************
        Dim sbICSFile As StringBuilder = New StringBuilder()
        Dim dtNow As DateTime = DateTime.Now
    
        sbICSFile.AppendLine("BEGIN:VCALENDAR")
        sbICSFile.AppendLine("VERSION:2.0")
        sbICSFile.AppendLine("PRODID:-//AkonaDev/CalendarAppointment")
        sbICSFile.AppendLine("CALSCALE:GREGORIAN")
        sbICSFile.AppendLine("BEGIN:VEVENT")
    
        ' Define time zones.
        ' US/Eastern
        sbICSFile.AppendLine("BEGIN:VTIMEZONE")
        sbICSFile.AppendLine("TZID:US/Eastern")
        sbICSFile.AppendLine("BEGIN:STANDARD")
        sbICSFile.AppendLine("DTSTART:20071104T020000")
        sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11")
        sbICSFile.AppendLine("TZOFFSETFROM:-0400")
        sbICSFile.AppendLine("TZOFFSETTO:-0500")
        sbICSFile.AppendLine("TZNAME:EST")
        sbICSFile.AppendLine("END:STANDARD")
        sbICSFile.AppendLine("BEGIN:DAYLIGHT")
        sbICSFile.AppendLine("DTSTART:20070311T020000")
        sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3")
        sbICSFile.AppendLine("TZOFFSETFROM:-0500")
        sbICSFile.AppendLine("TZOFFSETTO:-0400")
        sbICSFile.AppendLine("TZNAME:EDT")
        sbICSFile.AppendLine("END:DAYLIGHT")
        sbICSFile.AppendLine("END:VTIMEZONE")
    
        ' US/Central
        sbICSFile.AppendLine("BEGIN:VTIMEZONE")
        sbICSFile.AppendLine("TZID:US/Central")
        sbICSFile.AppendLine("BEGIN:STANDARD")
        sbICSFile.AppendLine("DTSTART:20071104T020000")
        sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11")
        sbICSFile.AppendLine("TZOFFSETFROM:-0500")
        sbICSFile.AppendLine("TZOFFSETTO:-0600")
        sbICSFile.AppendLine("TZNAME:CST")
        sbICSFile.AppendLine("END:STANDARD")
        sbICSFile.AppendLine("BEGIN:DAYLIGHT")
        sbICSFile.AppendLine("DTSTART:20070311T020000")
        sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3")
        sbICSFile.AppendLine("TZOFFSETFROM:-0600")
        sbICSFile.AppendLine("TZOFFSETTO:-0500")
        sbICSFile.AppendLine("TZNAME:CDT")
        sbICSFile.AppendLine("END:DAYLIGHT")
    
        sbICSFile.AppendLine("END:VTIMEZONE")
    
        ' US/Mountain
        sbICSFile.AppendLine("BEGIN:VTIMEZONE")
        sbICSFile.AppendLine("TZID:US/Mountain")
        sbICSFile.AppendLine("BEGIN:STANDARD")
        sbICSFile.AppendLine("DTSTART:20071104T020000")
        sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11")
        sbICSFile.AppendLine("TZOFFSETFROM:-0600")
        sbICSFile.AppendLine("TZOFFSETTO:-0700")
        sbICSFile.AppendLine("TZNAME:MST")
        sbICSFile.AppendLine("END:STANDARD")
        sbICSFile.AppendLine("BEGIN:DAYLIGHT")
        sbICSFile.AppendLine("DTSTART:20070311T020000")
        sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3")
        sbICSFile.AppendLine("TZOFFSETFROM:-0700")
        sbICSFile.AppendLine("TZOFFSETTO:-0600")
        sbICSFile.AppendLine("TZNAME:MDT")
        sbICSFile.AppendLine("END:DAYLIGHT")
        sbICSFile.AppendLine("END:VTIMEZONE")
    
        ' US/Pacific
        sbICSFile.AppendLine("BEGIN:VTIMEZONE")
        sbICSFile.AppendLine("TZID:US/Pacific")
        sbICSFile.AppendLine("BEGIN:STANDARD")
        sbICSFile.AppendLine("DTSTART:20071104T020000")
        sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11")
        sbICSFile.AppendLine("TZOFFSETFROM:-0700")
        sbICSFile.AppendLine("TZOFFSETTO:-0800")
        sbICSFile.AppendLine("TZNAME:PST")
        sbICSFile.AppendLine("END:STANDARD")
        sbICSFile.AppendLine("BEGIN:DAYLIGHT")
        sbICSFile.AppendLine("DTSTART:20070311T020000")
        sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3")
        sbICSFile.AppendLine("TZOFFSETFROM:-0800")
        sbICSFile.AppendLine("TZOFFSETTO:-0700")
        sbICSFile.AppendLine("TZNAME:PDT")
        sbICSFile.AppendLine("END:DAYLIGHT")
        sbICSFile.AppendLine("END:VTIMEZONE")
    
        ' Define the event
        sbICSFile.Append("DTSTART;TZID=" + ddlStartTZ.Text + ":")
        sbICSFile.Append(CDATE(txtStartDate.value).Year.ToString())
        sbICSFile.Append( _
            FormatDateTimeValue(CDATE(txtStartDate.value).Month))
        sbICSFile.Append( _
            FormatDateTimeValue(CDATE(txtStartDate.value).Day) + "T")
        sbICSFile.AppendLine(ddlStartTime.SelectedValue)
    
        sbICSFile.Append("DTEND;TZID=" + ddlEndTZ.Text + ":")
        sbICSFile.Append(CDATE(txtStartDate.value).Year)
        sbICSFile.Append( _
            FormatDateTimeValue(CDATE(txtStartDate.value).Month))
        sbICSFile.Append( _
            FormatDateTimeValue(CDATE(txtStartDate.value).Day) + "T")
        sbICSFile.AppendLine(ddlEndTime.SelectedValue)
    
        sbICSFile.AppendLine("SUMMARY:" + txtEventSubject.Text)
        sbICSFile.AppendLine("DESCRIPTION:" + txtEventDescription.Text)
        sbICSFile.AppendLine("UID:1")
        sbICSFile.AppendLine("SEQUENCE:0")
    
        sbICSFile.Append("DTSTAMP:" + dtNow.Year.ToString())
        sbICSFile.Append(FormatDateTimeValue(dtNow.Month))
        sbICSFile.Append(FormatDateTimeValue(dtNow.Day) + "T")
        sbICSFile.Append(FormatDateTimeValue(dtNow.Hour))
        sbICSFile.AppendLine(FormatDateTimeValue(dtNow.Minute) + "00")
    
        sbICSFile.AppendLine("END:VEVENT")
        sbICSFile.AppendLine("END:VCALENDAR")    
    
        '** SET TO SESSION VARIABLE INSTEAD OF CALLING RESPONSE.WRITE **
        Session("ICSFile") = sbICSFile.ToString
    
    Catch exc As Exception
        lblError.text = exc.toString       
    
    End Try
    End Sub
    

    ICS File Download Page

    Sub Page_Load(Src As Object, E As EventArgs)                              
    Try
        '** GET ICS FILE FROM SESSION VARIABLE
        Dim ICSFile As String = Session("ICSFile").ToString
    
        Response.ContentType = "text/calendar"
        Response.AddHeader("content-disposition", "attachment; filename=CalendarEvent1.ics")
        Response.Write(ICSFile)
        Response.End()
    
    Catch exc As Exception
        lblError.text = exc.toString
    End Try         
    End Sub
    

    HTML

    asp:Button ID="btnAddToCalendar" runat="server" OnClick="AddToCalendar" OnClientClick="javascript:DownloadICS();" Text="Add To Calendar" />

    JavaScript

    <script type="text/javascript" language="javascript">
     function DownloadICS() {
        popUp("ics_download.aspx", 300, 300);
    }
    
    function popUp(url, width, height) {
        if (window.featWin && !window.featWin.closed) {
            window.featWin.close();
            featWin = window.open(url, "win", 'toolbar=0,location=1,directories=0,status=0,menubar=0,scrollbars=1,resizable=1,width=' + width + ',height=' + height);
            selfWin = self;
            featWin.focus();
        }
        else {
            featWin = window.open(url, "win", 'toolbar=0,location=1,directories=0,status=0,menubar=0,scrollbars=1,resizable=1,width=' + width + ',height=' + height);
            selfWin = self;
            featWin.focus();
        }
    }
    function closeWin() {
        if (window.featWin && !window.featWin.closed) {
            window.featWin.close();
        }
    }