2010-01-09 69 views
1

我有這個如何使用jQuery呈現響應流?

MemoryStream export = new MemoryStream(); 
    iCalendarSerializer serializer = new iCalendarSerializer(iCal); 
    serializer.Serialize(export,System.Text.Encoding.UTF8); 
    return export; 

,所以我使用C#DDay.iCal庫導出我的日曆。 Serialize接受一個「流」,所以我傳遞了一個內存流。

我現在有一個通用的處理程序,它調用包含上述代碼的方法。

public class CalendarHandler : IHttpHandler 
    { 
     private Calendar service; 
     private Membership membershipS; 

     public void ProcessRequest(HttpContext context) 
     { 
      service = new Calendar(); 
      membershipS = new Membership (null); 
      string userName = context.User.Identity.Name; 
      Guid userId = membershipS.GetUsersId(userName); 

      context.Response.ContentType = "text/calendar"; 
      // calls the export calendar(the code that showed above that uses dDay ical. 
      var t = service.ExportCalendar(userId); 

      t.WriteTo(context.Response.OutputStream); 

     } 

     public bool IsReusable 
     { 
      get 
      { 
       return false; 
      } 
     } 
    } 

所以現在我寫icalendar到輸出流。現在我有一個jQuery發佈到這個方法,現在我不知道如何獲取jQuery文章的OutputStream結果,並使用彈出的保存對話框。

$('#ExportCalendar').click(function(e) 
{ 
    $.post('../Models/CalendarHandler.ashx', null, function(r) 
    { 

    }); 

    return false; 
}); 

回答

1

我不認爲一個AJAX文章可以導致文件保存對話框顯示。這是因爲AJAX帖子是以編程方式製作Web請求併發生在幕後(即,沒有用戶的知識)。

嘗試改變鏈接是一個常規(非AJAX)的鏈接,如:您還需要設置內容部署標頭得到很好的保存文件對話框

<a href="CalendarHandler.ashx">Save Calendar</a> 

。請參閱此鏈接的詳細信息:

http://www.hanselman.com/blog/TheContentDispositionSagaControllingTheSuggestedFileNameInTheBrowsersSaveAsDialog.aspx

+0

@Eilon +1你對這種情況是正確的。我構建了一個小的JS/Flash庫,它*可以*允許這樣做,但它的目的是用於生成*和*保存文件在客戶端。不要在服務器上生成文件,然後將其保存在客戶端上:http://downloadify.info – 2010-01-09 02:21:24

0

無法通過AJAX使文件對話框彈出。但是,您可以這樣做:

document.location = yourRequestUrl 

並且會生成一個對話框。如果你真的需要它是一個後,使用

$(this).parent("form").submit() 

爲你的點擊處理程序。

確保將context.Response.ContentType設置爲「text/ical」。這告訴瀏覽器如何處理響應。