我有这个
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写到了Outputstream。现在我有一个jquery帖子转到这个方法,现在我不知道如何获取jquery帖子将获得的OutputStream结果并使用保存对话框弹出它。
$('#ExportCalendar').click(function(e)
{
$.post('../Models/CalendarHandler.ashx', null, function(r)
{
});
return false;
});
答案 0 :(得分:1)
我认为AJAX帖子不会导致显示文件保存对话框。这是因为AJAX帖子用于以编程方式发出Web请求并在幕后发生(即,在用户不知情的情况下)。
尝试将链接更改为常规(非AJAX)链接,例如:
<a href="CalendarHandler.ashx">Save Calendar</a>
您还需要设置内容处置标头以获取nice文件保存对话框。有关详细信息,请参阅此链接:
答案 1 :(得分:0)
您无法通过ajax弹出文件对话框。但是,您可以这样做:
document.location = yourRequestUrl
这将生成一个对话框。如果您真的需要它作为帖子,请使用
$(this).parent("form").submit()
作为点击处理程序。
请务必将context.Response.ContentType设置为“text / ical”。这告诉浏览器如何处理响应。