2015-06-26 2 views
0

У меня есть приложение, которое я пишу, которое динамически создает файл .ICS, получая данные от пользователя. То, что я пытаюсь сделать, это сохранить данные в базе данных, а затем предложить файл .ICS для загрузки пользователем, чтобы они могли добавить его в свой календарь. Я бы хотел, чтобы все это произошло одним нажатием кнопки. Проблема, с которой я сталкиваюсь, - это когда кнопка нажата, она записывает файл, чтобы пользователь мог его загрузить, но он не хранит данные в базе данных. Он остается на странице и не отображается для обратной передачи.Ответ. .write для файла .ics, не позволяющего запускать код.

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 
+0

У вас есть все, что в Try/уловом .. При отладке, где это не получится? – InbetweenWeekends

+0

Это то, что он не проваливает и не бросает никаких ошибок. Он ведет себя так, как будто он завершает работу, но после того, как страница записывает файл для загрузки, он не отображается для обратной передачи. Я считаю, что это не сохранение данных в базе данных. – Jonathan

+0

Этот код является безумным, уязвимым для SQL-инъекций. Это практически попрошайничество, чтобы его взломали. Используйте параметризованные запросы вместо строковой конкатенации для создания своих SQL-операторов. –

ответ

0

Я обнаружил, что ответ может выполнять только одну из этих вещей за раз. Он не может отправить файл и выполнить код сервера. Так что я сделал, это создать отдельную страницу загрузки файлов, которая обрабатывает загрузку файла на page_load. Чтобы получить данные файла ICS на страницу загрузки файла, я создал переменную сеанса, которая заполняется при нажатии кнопки на странице отправки. Затем я добавил событие onClientClick к кнопке и установил ее в функцию javascript, которая открывает всплывающее окно на страницу загрузки файла. Это позволило странице сохранить данные в базе данных и отобразить приглашение загрузки файла одним нажатием кнопки.

Подача Страница

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 Загрузка файла 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

жерех: кнопка ID = "btnAddToCalendar" Runat = "сервер" OnClick = "AddToCalendar" OnClientClick = "javascript: DownloadI CS();» Text = "Добавить в календарь" />

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(); 
    } 
} 

+0

Реакция, безусловно, способна выполнять обе эти вещи. Вы можете отправить один ответ клиенту, но в процессе отправки этого ответа вы можете выполнить любой код сервера, который вам нравится. Проблема в том, что вы пытаетесь отправить два ответа: один ответ с файлом * .ics и другой ответ, который обновляет страницу в браузере. –

+0

Как бы вы объединили их в один ответ? – Jonathan

+0

@Jonathon Я бы обработал изменения пользовательского интерфейса в javascript. Но вопрос подразумевает, что вы не совсем понимаете, что делает код сервера ASP.Net, когда вы вызываете обратную передачу. –

0

Первое, что я замечаю, что ваш INSERT заявление, кажется, есть некоторые проблемы. (Вероятно, поэтому синтаксическая раскраска в вашем блоке кода выглядит не так.) Строки обычно завертываются в одинарные кавычки. Это должно вызывать исключение, поэтому я не уверен, как он продолжается до ExecuteNonQuery. Я ожидал увидеть нечто подобное.

sqlStr = "INSERT INTO tblActivity(Subject,Comment,StartDate,EndDate) " & _ 
     "VALUES('" & Subject & "','" & Comment & "','" & StartDate & "','" & EndDate &"')" 

Лучшей альтернативой является параметризованная инструкция. Пожалуйста, прочитайте об этом. Ваш код as-is уязвим для SQL-инъекции. How does SQLParameter prevent SQL Injection?