Sharepoint und die Downloads aus dem Web Part

Gregor Ottmann | April 10, 2008 on 3:08 pm | In .Net, JavaScript, Know-How |

Eigentlich ist die Anforderung ganz einfach und keineswegs unüblich: Man will auf einer Website irgendeine Datei dynamisch generieren, beispielsweise einen Excel-Report, die man dann per Klick auf einen Button zum Download anbietet. Sowas ist im Regelfall nicht schwer, außer natürlich, wenn man ein “Web Part” für Sharepoint baut. Wenn man das tut ist, wie ich inzwischen weiß, ziemlich vieles schwer, schmerzhaft und generell mehr oder weniger unbefriedigend.

An sich ist die Sache aj auch in ASP ganz easy und in vielen Blogposts beschrieben, beispielsweise bei den Dotnetslackers. Das Problem ist nur, dass bei diesem Ansatz die Datei erst nach einem Postback generiert und an den Client geschickt wird, dieser Postback aber das momentan angezeigte Formular nicht neu vom Server lädt. Problem? Wieso Problem?

Ganz einfach: Sharepoint meint es gut mit uns und sorgt per JavaScript dafür, dass Formulare nicht öfter als einmal abgeschickt werden können, beispielsweise durch amokklickende Benutzer. Das führt dazu, dass nach dem Download der Datei das Formular hinüber ist, d.h. es nicht mehr abgeschickt werden kann, weil es ja schon mal abgeschickt wurde. Sehr blöde, und die Lösungen, von denen ich gelesen habe, waren allesamt extrem kompliziert zu implementieren, weil sie irgendwelche speziellen Download-Handler vorgesehen haben. Mensch, Leute, ich habe eine Deadline und nicht beliebig viel Budget - ich brauche eine EINFACHE Lösung. Meinetwegen auch einen kleinen Hack.

Einen solchen Hack habe ich dann auch hinbekommen. Diese Resubmit-Sperre wird von Sharepoint nämlich im onsubmit-Handler des Formulars aufgerufen, so dass man nur beim Klick auf den Downloadbutton genau diesen Handler wegschießen muss:

exportButton = new Button();
exportButton.Text = “Generate some Excel stuff”;

// the handler method generates the file, writes it to the response and ends the response.
exportButton.Click += onExcelExportClicked;

// erase the form’s onsubmit handler when the button is clicked
exportButton.OnClientClick = “this.form.onsubmit = function() {return true;}”;

Hässlich, ja, und eventuell auch gefährlich, wenn man nicht aufpasst, aber es funktioniert. Die nächste Verbesserung wird sein, dass ich irgendwie nach dem Download den ursprünglichen onsubmit-Handler wieder herstelle oder so - aber das mache ich erst, wenn ich es brauche.

(Nur, falls irgendwer sich wundert: Das Posting mit dem identischen Codebeispiel im MSDN-Forum ist nicht geklaut, sondern auch von mir.)

Keine Kommentare vorhanden »

RSS-Feed für Kommentare zu diesem Beitrag.

Eintrag vornehmen

You must be LOGGED IN um einen Kommentar zu erstellen.

Entries and comments feeds. Valid XHTML and CSS. ^Top^

xml :RSS2-Feed