2017-04-04 13 views
0

Web開発の新機能。 私は、ユーザーがExcelファイルを選択できるビューを持っています。 送信プレビューボタンを押すとファイルが読み込まれ、データがプレビューされます。 その後、dbアップロード用のモデルにモデルを送り返すことができます。 (これは私が苦労している部分です)。複雑なモデルをasp.net mvcのコントローラーに戻す方法

ビューモデル:

public class UploadItemsViewModel 
{ 
    public List<Item> Items { get; set; } 

    public int CompanyID { get; set; } 
    public Company Company { get; set; } 

    public HttpPostedFileBase upload { get; set; } 

    public UploadJournalsViewModel() 
    { 
     Items = new List<Item>(); 
    } 

} 

コントローラー:

public ActionResult Upload(FormCollection formCollection, int CompanyID) 
    { 
     if (Request != null) 
     { 
      HttpPostedFileBase file = Request.Files["UploadedFile"]; 
      if ((file != null) && (file.ContentLength > 0) && !string.IsNullOrEmpty(file.FileName)) 
      { 
       string fileName = file.FileName; 
       string fileContentType = file.ContentType; 
       byte[] fileBytes = new byte[file.ContentLength]; 
       var data = file.InputStream.Read(fileBytes, 0, Convert.ToInt32(file.ContentLength)); 
      } 
     } 
     UploadItemsViewModel itmViewModel = new UploadItemsViewModel { Company = db.Companies.Find(CompanyID), CompanyID = CompanyID }; 
     return View(itmViewModel); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Upload(UploadItemsViewModel itmViewModel, string Preview, string Upload) 
    { 
     if (ModelState.IsValid) 
     { 
      if (itmViewModel.upload != null && itmViewModel.upload.ContentLength >0) 
      { 
       try 
       { 
        itmlViewModel.Items = App.Services.ItemsMassUploadFileRead.ReadExcelFile(itmViewModel.upload, db.Companies.Find(itmViewModel.CompanyID)); 

        if (string.IsNullOrEmpty(Preview)) 
        { 
         foreach (var itm in itmViewModel.Items) 
         { 
          itm.StartDate = DateTime.Today; 
          itm.CompanyID = itmViewModel.CompanyID; 
          itm.User = null; 
          itm.Items.Add(itm); 
          db.SaveChanges(); 
         } 
         return View(); 
        } 
        else 
        { 
         return View(itmViewModel); 
        } 

        }     } 
       catch (Exception ex) 
       { 
        ModelState.AddModelError("File", ex.Message.ToString()); 
        return View(itmViewModel); 
       } 
      } 
      else 
      { 
       ModelState.AddModelError("File", "Please Upload Your file"); 
      } 
     } 
     return View(itmViewModel); 
    } 

閲覧:

@using (Html.BeginForm("Upload", "ItemsUpload", null, FormMethod.Post, new { enctype = "multipart/form-data" })) 

{@ Html.AntiForgeryToken() @ Html.HiddenFor(モデル=> model.CompanyID )

<div class="form-group"> 
    <div class="input-group"> 
     <label class="input-group-btn"> 
      <span class="btn btn-default"> 
       Browse&hellip; <input type="file" style="display: none;" accept=".xlsx" name="upload"> 
      </span> 
     </label> 
     <input type="text" class="form-control " readonly> 
    </div> 
    <span class="help-block"> 
     Please use a provided Excel template 
    </span> 
</div> 
<div class="form-group"> 
    <input type="submit" value="Preview" name ="Preview" class="btn btn-default" disabled style="display: none" id="submit"/> 
</div> 
<div class="form-group"> 
    <input type="submit" value="Upload" name="Upload" class="btn btn-default" id="Upload" /> 
</div> 

<div class="help-block" id="previewHelp" style="display: none"> 
    Preview results and scroll down to upload data to the database. 
</div> 



if (Model.Journals.Count != 0) 
{ 
    table here to preview the upload 
} 

「アップロード」ボタンをクリックした後、モデルは「アイテム」コレクションなしで戻ってきます。

+1

で表示上の任意の入力をレンダリングしていないので、あなたは、あなたが戻って投稿したいすべてのデータのための ''要素をレンダリングする必要があり、常にnullコントローラになります。 POSTリストの正しい方法については、http://stackoverflow.com/q/16321736/1450855を参照してください。MVCモデルバインダーはそれを理解しません。 –

+0

ありがとうございます。これを使用して問題を解決することができました。 – GlutVonSmark

答えて

2

Itemsリストには、名前Items

関連する問題