dedlfix: Zusammenspiel MVC/Ajax

Beitrag lesen

Tach!

Ich fang hier quasi nochmal neu zu antworten an, weil sich meine Vermutung bezüglich des My-Fehlers nicht bestätigt hat und ich hier besser zitieren kann.

ich habe ein Problem bezüglich des Zusammenspiels von MVC und Ajax. Ich habe ein div-Element wo im ersten Schritt ein Bild dynamisch geloaded wurde. Ich versuche nun diese Informationen via Ajax an eine MVC-Methode weiterzugeben und diese dann als Stream herunterzuladen.

Du hast zwar deinen Code als Java ausgezeichnet, aber ich gehe doch recht in der Annahme, dass es sich stattdessen um C# handelt? Ich tu mal so in der nachfolgenden Antwort.

<div id="myPicture"></div>

<input type="submit" onclick="saveMyImage(document.getElementById('myPicture').innerHTML)" />

  
Was genau befindet sich denn für HTML-Code in dem div-Element? Wenn da ein Bild drin sein soll, müsste .innerHTML einen String à la '<img src="irgendwas">' liefern. Du kannst das prüfen. Breakpoint setzen, Debugger starten und nachschauen ob das was da drin steht deinen Erwartungen entspricht. Visual Studio und der Internet Explorer arbeiten da sehr gut zusammen.  
  

> [Javascript-Teil]  
  
Dieser String geht also per Ajax auf Reisen.  
  

> ~~~java

public void SaveMyImage(string img)  

> {  
>      MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(img));  
>      ms.WriteTo(Response.OutputStream);  
>      ....  
> }

Und hier kommt also ein Stück HTML-Code an. Wenn du "ASP.NET MVC" nimmst, dann ist das direkte Ansprechen von Response.OutputStream nicht die feine englische Art. Es gibt diverse Ableitungen der ActionResult-Klasse. Da solltest du die passende heraussuchen und das Ergebnis auf diese Weise aus der Action-Methode zurückgeben. JsonResult bietet sich hier an.

So weit so gut. Hire soll aber das Downloadfenster aufgehen, was nicht passiert. Ist das, was ich vorhabe überhaupt machbar? Hat jemand eine Idee?

Nach dem Ajax-Request bist du wieder in deinem Javscript-Teil, konkret in der Methode, die du als success übergeben hast. Da müsste also ein Alert-Fenster aufgehen. Du willst aber dass aus Javascript heraus eine Datei gespeichert wird. Das ist üblicherweise dem Javascript nicht gestattet. Die File API von HTML5 kam mir grad in den Sinn, aber die kann nur Dateien lesen. Das wird also nicht auf diese Weise gehen. Oder du findest in den Weiten des Internets einen Beitrag von jemandem, der es irgendwie von hinten durch die Brust ins Auge geschafft hat, Javascript zum Speichern einer Datei anzuregen.

Alternativer Vorschlag: Setz ein normales HTML-Formular auf. Häng dich ins Submit-Event. Befülle Hidden-Felder mit den gewünschten Inhalten. Möchtest du allerdings an die Bild-Daten kommen und keinen HTML-Code verarbeiten, dann musst du erstmal herausfinden, wie das konkret geht (javascript read image content - oder ähnliche Suchstichwörter bieten sich an). Das Formular schickt es ab (direkt aus dem Browser ohne Javascript-Umweg) und die Verarbeitung landet bei einer Controller-Action. Die kann dann ein FileResult (das hat auch noch drei Unterklassen, eine davon für Streams) oder ein ContentResult zurückliefern. Mit passendem Content-Type kann der Browser das dann auch direkt speichern (force file download als weitere Stichwörter).

dedlfix.