2016-04-08 7 views
1

Ich habe eine Razor-Seite, wo ich einige Daten (nicht in einem Formular) laden und eines dieser "Felder" ist eine Datei.Datei von ViewBag laden?

<div class="col-sm-3"> 
    <label>Upload Construction Map:</label> 
    <br /> 
    <div class="input-group"> 
     <span class="input-group-btn"> 
     <span class="btn btn-primary btn-file"> 
      Browse @Html.TextBoxFor(m => m.ShapeFileModel.ConstructFile, new { id = "fu-construct", type = "file", accept = ".pdf" }) 
     </span> 
     </span> 
     @{ 
     if (fileId != "") 
     { 
      int theId = int.Parse(fileId); 
      CrossCData.DAL.File fileMap = (from f in dbCrossingsCloud.Files 
              where f.Id == theId 
              select f).SingleOrDefault(); 
     <input type="text" id="txtPathConstruct" class="form-control" value="@fileMap.FileName" contenteditable="false" readonly /> 
     } 
     else 
     { 
     <input type="text" id="txtPathConstruct" class="form-control" value="" contenteditable="false" readonly /> 
     } 
     } 
    </div> 
</div> 

Ich kehre in ViewBag.fileId die ID der Datei, dann habe ich die Details der Datei erhalten, die in einem Dateisystem gespeichert wird (nicht-Datenbank). Also ... Dateipfad (Ordnerpfad) und Dateiname.

Ist es möglich, IO in Razor zu verwenden, um eine Datei auf den Eingang zu laden? und zu einer Javascript-Variable?

Jede Hilfe wird geschätzt!

Javascript Ich verwende die Datei

$("#fu-construct").fileupload({ 
     url: 'UploadConstructFile', 
     dataType: 'json', 
     // File was added 
     add: function (e, data) { 
      var fileExtension = ['pdf']; // Valid file extensions 
      if ($.inArray($("#txtPathConstruct").val().split('.').pop().toLowerCase(), fileExtension) == -1) { 
       swal("Error", "Only PDF files are allowed. Please select a file in PDF format.", "error"); 
       $("#txtPathConstruct").val("No file chosen..."); 
       constructData = null; 
      } else { 
       constructData = data; 
      } 
     }, 
     // UploadConstructFile is done 
     done: function (event, data) { 
      fileId = data.result.fileId; 
      if (projectCompany == "" || typeof projectCompany == 'undefined') { 
       swal("Error", "Please enter a requesting company", "error"); 
      } 
      else if (projectName == "" || typeof projectName == 'undefined') { 
       swal("Error", "Please enter a project name.", "error"); 
      } 
      else if (projectType == "" || typeof projectType == 'undefined') { 
       swal("Error", "Please select a project type.", "error"); 
      } 
      else { 
       post('Audit', 'post', JSON.stringify(myDataTable.rows().data().toArray()), fileId, projectCompany, projectName, projectType, projectFileNumber, projectAFECC); 
      } 
     }, 
     fail: function (event, data) { 
      alert("Error uploading the file."); 
      $("#txtPathShape").val("No file chosen..."); 
     } 
    }); 

    $("#construct-upload").on('click', function() { 
     if (constructData) { 
      constructData.submit(); 
     } 
     return false; 
    }); 
+0

Es wird allgemein als schlechte Praxis angesehen, Daten über ViewBag zu übertragen. Ich würde vorschlagen, ein stark typisiertes View-Modell und die HttpPostedFile-Klasse als Feld zu verwenden. – JDupont

+0

Ich habe deine Frage noch einmal gelesen. Versuchen Sie, die Datei von Ihrem Server aus bereitzustellen oder lassen Sie den Benutzer die Datei auf den Server hochladen? Wenn es der spätere (* Client sendet Datei an Server *) ist meine Antwort nicht korrekt, aber ich kann es mit meiner Empfehlung neu schreiben. – Igor

+0

Der Benutzer lädt die Datei hoch und sobald sie in Add.cshtml eingegeben haben, speichere ich sie auf dem Server, dann möchte der Benutzer aus der Audit.cshtml-Datei zurückgehen und die Informationen reparieren, aber ich muss die Datei erneut in 'constructData' laden in Javascript. –

Antwort

1

Ist es möglich, zu verwenden IO in Razor zu verwalten, eine Datei mit dem Eingang zu laden? und zu einer Javascript-Variable?

Razor erstellt einen Textstream, der an den Browser gesendet wird. Der Inhalt des Textes wird (normalerweise) als HTML erwartet. Wenn Sie eine Datei einfügen möchten, müssten Sie sie in ein Feld schreiben (möglicherweise Eingabeart ausgeblendet) als base64 für Binärdateien oder als Nur-Text für Textdateien. Ich würde vermeiden diesen Ansatz und Dateiinhalt nicht in der Ansicht selbst enthalten.

Eine bessere Option eine MVC Controller-Methode oder ein Web API Verfahren zu schaffen, wäre das eine Datei auf einer eindeutige Kennung auf Basis dienen kann (Ihre genannte Datei-ID ist wahrscheinlich perfekt). Sie würden dann den Bezeichner in Ihre Razor-Ausgabe (anstelle des Inhalts der Datei) einfügen und könnten ihn mit einem AJAX-Aufruf von JavaScript abrufen, wenn Sie ihn benötigen.