如何使用jquery呈现响应流?

时间:2010-01-09 01:44:08

标签: c# asp.net 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写到了Outputstream。现在我有一个jquery帖子转到这个方法,现在我不知道如何获取jquery帖子将获得的OutputStream结果并使用保存对话框弹出它。

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

    });

    return false;
});

2 个答案:

答案 0 :(得分:1)

我认为AJAX帖子不会导致显示文件保存对话框。这是因为AJAX帖子用于以编程方式发出Web请求并在幕后发生(即,在用户不知情的情况下)。

尝试将链接更改为常规(非AJAX)链接,例如:

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

您还需要设置内容处置标头以获取nice文件保存对话框。有关详细信息,请参阅此链接:

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

答案 1 :(得分:0)

您无法通过ajax弹出文件对话框。但是,您可以这样做:

document.location = yourRequestUrl

这将生成一个对话框。如果您真的需要它作为帖子,请使用

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

作为点击处理程序。

请务必将context.Response.ContentType设置为“text / ical”。这告诉浏览器如何处理响应。