2016-04-08 8 views
1

私はいくつかのデータを(フォームではなく)ロードし、それらのフィールドの1つはファイルです。ViewBagからファイルをロードしますか?

<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> 

Iは、私は、ファイルシステム(ないデータベース)に格納されたファイルの詳細情報を取得し、ViewBag.fileIdファイルのIDに戻ります。だから...ファイルの場所(フォルダパス)とファイル名。

RazorでIOを使用してファイルを入力にロードすることはできますか?とjavascript変数に?

ご協力いただければ幸いです!

私はファイル

$("#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

一般に、ViewBagでデータを渡すのは悪い習慣と考えられます。厳密に型指定されたビューモデルとHttpPostedFileクラスをフィールドとして使用することをお勧めします。 – JDupont

+0

質問を再読しました。サーバーからファイルを提供しようとしているのか、ユーザーがファイルをサーバーにアップロードしようとしていますか?後で(*クライアントがサーバーにファイルを送信する*)私の答えが正しくないが、私はそれを私の推薦で書き直すことができます。 – Igor

+0

ユーザーがファイルをアップロードし、Add.cshtmlで送信したらサーバーに保存してから、Audit.cshtmlファイルから戻って情報を修正したいのですが、ファイルを 'constructData'に再度ロードする必要があります。 JavaScriptで。 –

答えて

1

を管理するために使用するにはjavascriptが入力にファイルをロードするためにカミソリでIOを使用することが可能ですか?とjavascript変数に?

Razorは、ブラウザに送信されるテキストストリームを作成します。テキストの内容は(通常)htmlであると予想されます。ファイルをインクルードしたい場合は、バイナリファイルの場合はbase64、テキストファイルの場合はプレーンテキストとしてフィールドに書き込む必要があります(おそらく入力タイプは隠しておきます)。 このアプローチを避け、ビュー自体にファイルコンテンツを含めないでください

より良いオプションはMVCコントローラのメソッドまたは一意の識別子(Idはおそらく完璧ですあなた言及したファイル)に基づいてファイルを果たすことができWeb APIメソッドを作成することです。その後、あなたのRazor出力(ファイルの内容の代わりに)に識別子を含めると、必要に応じてJavaScriptからAJAX呼び出しで識別子を取得できます。

関連する問題