15

I generate a vcard that I send to the client using the following code snippet:

Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", fileNameOnly));
Response.ContentType = "text/x-vcard";
Response.ContentEncoding = Encoding.GetEncoding("ISO-8859-1");
Response.Write(vCard.ToString());
Response.End();

However, I need to use vCards on a page that has the control inside and UpdatePanel. Unfortunately, according to Update panel and Response write this does not work and causes an error. I am wondering what are some alternative ways to send the contents of the vcard/file to the client's browser and have it display "open/save" dialog that don't involve Response.Write?

Chris Stillwell
  • 10,266
  • 10
  • 67
  • 77
laconicdev
  • 6,360
  • 11
  • 63
  • 89
  • Only if you make update panel to cancel the ajax update and make full post of hole page. Other way is to use a handler to send your x-vcard and this is better from all cases. – Aristos Apr 04 '12 at 16:04

4 Answers4

40

You can't use Response.Write during an asynchronous postback. Whatever control executes that code needs to be added as a PostBackTrigger in the update panel:

<Triggers>        
    <asp:PostBackTrigger ControlID="Button1" />
</Triggers>

You can also do it in code-behind, if you prefer:

ScriptManager.GetCurrent().RegisterPostBackControl(Button1);
James Johnson
  • 45,496
  • 8
  • 73
  • 110
1

Response.Write will not work under Asynchronous Events. My suggestion is to remove the Update Panel in case it is specifically being used for VCard point of view only.

Alternatively - Place a control inside the Update Panel and initialize it's value under asynchronous event. Now it will work.

Pankaj
  • 9,749
  • 32
  • 139
  • 283
1

Why don't you consider the use of a separate handler/page to serve the vcard?

This is maybe the easiest and cleaner way to do that and it doesnt interfere any other (async or not) postback related to the updatepanel.

Alex Pollan
  • 863
  • 5
  • 13
1

I had a similar problem with Response.Write. I found a workaround or maybe even a solution to this problem. Capture the TextWriter given to the RenderBeginTag of a server control and write to that.

I blogged with an example here: http://timscyclingblog.wordpress.com/2013/03/07/asp-net-web-forms-response-write-in-an-updatepanel-dev-web/

CaringDev
  • 8,391
  • 1
  • 24
  • 43
user2000095-tim
  • 446
  • 2
  • 6
  • 1
    This is technically an answer to the question, but it landed in LQP so it's liable to get deleted by trigger-happy reviewers. Consider including some of your blog post in this answer. – Jeffrey Bosboom Mar 21 '16 at 21:25