2016-05-09 18 views
0

Ich versuche eine Methode hinzuzufügen, die einen Link aus meiner Grid-Ansicht verwendet, ruft dann die Datei vom Server in Form eines Streams ab und fordert den Benutzer auf, sie zu speichern . Ich habe die System.Windows.Forms-Referenz zu meinem Controller hinzugefügt und dann die folgende Methode hinzugefügt.SaveFileDialog kann nicht mit meiner Webseite arbeiten

[HttpGet] 
[Authorize] 
public void DownloadAssetStream(int assetID) 
{ 
    //gStream created from server file. 
    Stream myStream = gStream; 
    SaveFileDialog saveFileDialog1 = new SaveFileDialog(); 

    saveFileDialog1.Filter = "pdf files (*.pdf)|*.pdf|All files (*.*)|*.*"; 
    saveFileDialog1.FilterIndex = 2; 
    saveFileDialog1.RestoreDirectory = true; 

    if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
    { 
      if ((myStream = saveFileDialog1.OpenFile()) != null) 
      { 
       // Write file from stream. 
       myStream.Close(); 
      } 
     } 
    } 
} 

Es gibt keine Fehler, aber wenn Codezeile schlägt if (saveFileDialog1 es geht nirgendwo und Dialog nicht angezeigt. Was vermisse ich?

+2

Datei speichern Dialog ist Windows Forms Komponente. Es wird nicht in Asp.net-Seite funktionieren. – Nino

Antwort

0

Es gab ein paar nützliche Antworten, die zeigten, wie man die Datei als Stream zurückgibt, aber um ein Explorer-Fenster anzuzeigen, ist dies aufgrund der Browser-Sicherheit nicht möglich. Jeder, der dem Benutzer erlauben möchte, seinen eigenen Zielort zu definieren, muss mit dem browsereigenen Download-Mechanismus genügen, der die Datei lokal herunterlädt und dem Benutzer dann die Option gibt, wo er sie speichern kann.

2

Sie vermissen, dass Sie Windows-Steuerelemente in einer ASP.NET-Anwendung nicht verwenden können. Es funktioniert möglicherweise von Visual Studio, aber nicht in der realen Welt.

Anstatt zu versuchen, einen Dateidialog zu öffnen, um das Ergebnis in den Stream zu senden, zum Beispiel unter Verwendung eines FileStreamResult:

return new FileStreamResult(gStream, "application/pdf"); 

Der zweite Parameter ist der Inhaltstyp, wie zB ich den Inhaltstyp verwendet habe für PDF-Dateien.

+0

Vielen Dank für die Antwort, ich wurde aufgefordert, Benutzer mit Windows Explorer-Fenster (wie mit der Dateiupload-Komponente) zu fragen, wo der Download-Stream gehen soll. Das obige hat nichts getan, wie sollte ich DownloadAssetStream von meiner Chtml-Rasierklingen-Datei aufrufen, um ein Fenster zu erhalten, um den Zielort für den Strom zu definieren? – user616076

+1

Das bestimmt ein Browser, nicht Sie. Sie können auf diese Aktion über eine URL zugreifen, die der entsprechenden Route folgt. –

+0

Sie scheinen den ganzen Punkt zu verfehlen, selbst wenn ich einen Dateistrom zurückgebe, muss der Benutzer bestimmen, wo er ihn speichern soll. Da es so aussieht, als würden die meisten Browser kein Explorer-Popup zulassen, muss ich mich in die Browser-eigene Art des Downloads einklinken und unserem Projektmanager mitteilen, dass ihre Anfrage nicht möglich ist. – user616076

0

Sie können zurückkehren File Ergebnis in action

return File(gStream, "application/pdf", "DesiredNameToSave"); 

müssen Sie den Rückgabetyp Ihrer Aktion zu ActionResult ändern alle Art der unterstützten Rückkehr zu verarbeiten Werte

public ActionResult DownloadAssetStream(int assetID)