2016-11-17 7 views
0
nur ein mit einer Feile zu MVC Aktion senden

Gibt es eine Möglichkeit, den Openfiledialog mit js dann nur öffnen Taste a einreichen unter Verwendung der ausgewählte Datei packen (ohne Formular)Wie Submit-Button

das ist, was ich habe bis jetzt.

@using (Html.BeginForm("UploadAttachment", "DMS", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <input type="file" name="attach" /> 
    <button class="btn btn-danger" type="submit" name="attach">Upload</button> 
} 

Controller:

public async Task<ActionResult> UploadAttachment(HttpPostedFileBase attach) 
{ 
    // file processing 
} 
+0

ist Ihre Frage sinnvoll. Bitte lesen Sie es einmal und formulieren Sie es um. – Aravind

+0

Ok, ich möchte eine einzelne Schaltfläche auf meiner Seite, die den OpenFileDialog öffnet und dann, nachdem der Benutzer eine Datei auswählt, möchte ich in der Lage sein, die Datei in einem MVC-Controller zu verarbeiten. – user3159792

+0

Sie möchten die Datei an den Controller übergeben, ohne ein Formular zu verwenden? Bitte klären Sie Ihre Frage – hdrdiab

Antwort

1

ich Ihre Frage ein wenig zu interpretieren .. werde ich zwei Annahmen:

1) Sie eine Datei hochladen möchten, ohne eine Form zu veröffentlichen und so Aktualisieren Sie die Seite, dh asynchroner Upload 2) Sie möchten in der Lage sein, den Picker mit einer beliebigen Schaltfläche zu starten (so können Sie es wie gewünscht gestalten)

Die Lösung Wenn Sie auf eine Schaltfläche klicken, wird eine Dateiauswahl gestartet. Mehrere Dateien können ausgewählt werden und sie werden asynchron auf dem Server veröffentlicht (AJAX).

<input type="file" name="attach" id="attach-input" multiple="" style="display:none" /> 
<button type="submit" name="attach" id="attach-button">Upload</button> 

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
<script> 

    var button = $('#attach-button'); 
    var input = $('#attach-input'); 

    // translates collection of files into a form 
    function BuildFormData(files) { 

     var data = new FormData(); 

     for (var i = 0; i < files.length; i++) { 

      data.append(files[i].name, files[i]); 
     } 

     return data; 
    } 

    // posts the files to a given url 
    function PostData(url, data) { 

     $.ajax({ 
      // method 
      type: 'POST', 

      // endpoint 
      url: url, 

      // next 2 lines required for using FormData with jQuery 
      contentType: false, 
      processData: false, 

      // FormData instance 
      data: data, 

      // success handler 
      success: function (result) { 

       alert('files uploaded successfully'); 

       console.log(result); 
      } 
     }); 
    } 

    // when the button is clicked.. 
    button.on('click', function (e) { 

     // it launches the file picker 
     input.click(); 
    }); 

    // when the file picker changes.. 
    input.on('change', function (e) { 

     // turn it into a form 
     var data = BuildFormData(e.target.files); 

     // post the form to the action method 
     PostData('/Index/Attach', data); 
    }); 

</script> 

Die Aktion Methode, die ich in der asp.net MVC-Controller verwendet werden die Dateien in den Ordner App_Data der Anwendung speichern:

[HttpPost] 
    public void Attach() 
    { 
     foreach (string file in Request.Files) 
     { 
      HttpPostedFileBase fileContent = Request.Files[file]; 

      Stream stream = fileContent.InputStream; 

      string fileName = Path.GetFileName(file); 

      string path = Path.Combine(Server.MapPath("~/App_Data"), fileName); 

      using(var fileStream = System.IO.File.Create(path)) 
      { 
       stream.CopyTo(fileStream); 
      } 
     } 
    } 

Hoffnung, die Sie in die richtige Richtung lenkt.

+0

Vielen Dank <3 Hinweis: Sie könnten PostData ändern ('/ Index/Attach', Daten); zu PostData ('/ Home/Attach', Daten); oder sogar PostData ('/ {Controller}/{Aktion}', Daten); es sei denn, Sie haben einen Controller namens Index: P Nochmals vielen Dank :) – user3159792

+0

Ha - Ja, das ist tatsächlich, was mein Controller genannt wurde. Nette Idee, die Sicht aber automatisch auffüllen zu lassen, das gefällt mir. –

Verwandte Themen