Eigener Button zum Dateidownload

Folgende Situation: man hat ein selbstentwickeltes Webpart, das über einen Button eine Datei erstellt und dem Benutzer zum Download anbietet. Ein Benutzer klickt den Button und alles funktioniert, d.h. er bekommt die gewünschte Datei. Wenn er jetzt wieder in den Browser wechselt, reagiert kein Button mehr – auch der eigene nicht.

Die Ursache ist eine JavaScript-Variable von SharePoint, die beim Absenden des Formulars auf true gesetzt wird (um zu signalisieren, daß das Formular bereits gesendet wurde). Wenn der Code hinter einem eigenen Button jetzt eine Datei in den ResponseStream schreibt, bleibt dieser Variablenwert erhalten und verhindert weitere Postbacks. Man muß also nur diese Variable wieder auf false setzen und alles funktioniert wie gewünscht.

Getestet habe ich das mit folgendem einfachen Code in einem Webpart, der beim Klick auf einen Button eine einfache Textdatei an den Browser schickt. Der Browser reagiert mit seinem Download-Dialog darauf:

private void Button_Click(object sender, EventArgs e) {

  string text = "Hallo Welt";

  HttpResponse response = this.Page.Response;

  response.Clear();

  response.AddHeader("content-disposition", "attachment;filename=myfile.txt");

  response.ContentType = "application/text";

  response.Output.Write(text);

  response.End();

}

Der Button wurde dabei ebenso einfach erzeugt:

protected override void CreateChildControls() {

  Button btn = new Button();

  this.Controls.Add(btn);

  btn.ID = "myButton";

  btn.Text = "Download";

  btn.Click += Button_Click;

}

Man muß dem Button jetzt einfach noch ein wenig clientseitiges JavaScript mitgeben, das (nach einer kurzen Verzögerung) die SharePoint-Variable zurücksetzt und man kann auf den Button klicken so oft man möchte. Und auf alle anderen auch. Erreicht wird das durch eine weitere Zeile Code:

btn.OnClientClick = "window.setTimeout(function(){_spFormOnSubmitCalled=false;},10);";

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s