2016-07-15 4 views
-1

MVCで一括挿入作業中です。テキストフィールドとファイル(画像)を挿入したいと思います。ファイルアップロード者(入力=ファイル)からMVCでモデル化する方法

HttpPostedFileBase []でファイルを取得しています。

しかしモデル(写真)はnullを示しています。

モデル: -

public partial class User_Image 
    { 
     public int SrNo { get; set; } 
     public string Name { get; set; } 
     public string Photo { get; set; } 
    } 

ビュー: -

@if (Model != null && Model.Count > 0) 
{ 
    int j = 0; 
    foreach (var i in Model) 
    { 
     <tr> 
     <td>@Html.TextBoxFor(a => a[j].SrNo, new { @Value = Session["SrNo"], @class = "currnent_srno", @readonly = "true" })</td> 
     <td>@Html.TextBoxFor(a => a[j].Name, new { @required = "required", @class = "myclass" })</td> 
     <td>@Html.TextBoxFor(a => a[j].Photo, new { type = "file", @class = "fileuploader", @required = "required" })</td> 
     </tr> 
    } 
} 

コントローラのアクション: -

[HttpPost] 
    public ActionResult BulkData(List<User_Image> ci, HttpPostedFileBase[] file, FormCollection fc) 
    { 
     if (ModelState.IsValid) 
     { 
      using (TestEntities dc = new TestEntities()) 
      { 
       foreach (var i in ci) 
       { 
        dc.User_Image.Add(i); 
       } 
       dc.SaveChanges(); 
       ViewBag.Message = "Data successfully saved!"; 
      } 
     } 
    } 

jQueryの: - (すべての入力ファイルの名前ATTRを追加する)

$('input[type="file"]').attr('name', 'file'); 
+0

model-view-controllerタグは、パターンに関する質問用です。 ASP.NET-MVCの実装には特定のタグがあります。 –

+0

あなたがここで何をしようとしているかは非常に不明です。 'Photo'のフォームコントロールを生成することはありませんので、POSTメソッドでは常に' null'になります。あなたのファイルをアップロードしますが、どこにも保存しないので、ファイルは失われます。あなたはそれらをファイルサーバーに保存し、そのファイル名をデータベースに保存したいと思っていますか?いずれにしても、自分のやっていることを説明するために質問を編集してください(現在行っていることはほとんどMVCでなく、書き直す必要があります) –

答えて

0

モデルにFILEDATAを変換ロードするためのJavaScript関数を記述してください

このような
foreach (var i in Model) 
{ 
    <tr>   
     <td>@Html.HiddenFor(a => a.Photo, new { @class = "fileuploader", @required = "required" })</td> 
     <td><input type="file" name="uploadFile" id="uploadFile" /></td> 
    </tr> 
} 

である必要があり、制御がこの

public ActionResult BulkData(List<User_Image> ci, string Photo, FormCollection fc) 

ようにする必要があり、この

public partial class User_Image 
{ 
    public int SrNo { get; set; } 
    public string Name { get; set; } 
    public string Photo { get; set; } 
} 

とビューのようにする必要がありますアップロード時にbase64文字列。

+0

他のビューでも同じモデルを使用していますこのため、この場合のbcozは私の他の意見を変えなければなりません。 –

+0

でも私はこれで試してみましたが、エラー "System.Collections.Generic.List 'には' Photo 'の定義がなく、タイプの最初の引数を受け入れる' Photo 'という拡張メソッドはありません'System.Collections.Generic.List " –

+0

一つのことをしてください。 Base64文字列としてImage値を格納します。1つの非表示のコントロールを追加し、その入力要素のbase64値を割り当てるjavascript関数を作成します。そしてあなたのコントローラに文字列値を取得します。それを試してください。 –

0

私はこの問題に直面し、この問題を解決する別の方法を作りました。

(あなたのケースのリストで)属性をアクションにパラメータとして送信するのではなく、それらをformDataオブジェクトに追加し、そのデータを以下のようにajax呼び出しに渡して動作させて保存します。

   var formData = new FormData(); 
 
       var totalFiles = document.getElementById("attachFiles").files.length; 
 
       for (var i = 0; i < totalFiles; i++) { 
 
        var file = document.getElementById("attachFiles").files[i]; 
 

 
        formData.append("attachFiles", file); 
 
       } 
 
               
 
       formData.append('SrNo', varsrno); 
 
       formData.append('Name', varName); 
 
       formData.append('Photo', varPhoto); 
 

 
      $.ajax({ 
 
       type: "POST", 
 
       url: "@Url.Action("BulkData", "Controller")", 
 
       data: formData, 
 
       dataType: 'json', 
 
       contentType: false, 
 
       processData: false 
 
       
 
     });

 [HttpPost] 
 
     public JsonResult BulkData() 
 
     { 
 

 
      string Title = Request.Form.Get("SrNo"); 
 
      string Oasid = Request.Form.Get("Name"); 
 
      string keyword = Request.Form.Get("Photo"); 
 

 
      HttpFileCollectionBase attachFiles = null; 
 
      if (Request.Files.Count > 0) 
 
       attachFiles = Request.Files[0]; 
 

 
      foreach(file in attachFiles) 
 
      { 
 
       file.SaveAs(path); 
 
      } 
 
     }

あなたのためにうまくいけば、その有用。

関連する問題