2014-01-14 52 views
2

我已經能夠將多個文件通過follwing成功發佈到我的控制器以下幾點:MVC多文件上傳與其他數據

http://haacked.com/archive/2010/07/16/uploading-files-with-aspnetmvc.aspx/

然而, 我想也包括每個文件的一些信息上傳,用戶必須輸入例如一個標題和版本

這是一個demo可能顯示我想要實現的。

這是我現在想出來處理它in this way

這似乎不是正確的方式,因爲我習慣將模型傳遞給控制器​​? 此問題的另一個問題是,如果用戶添加了三個文件上載但只選擇了兩個文件,則它將不同步。

我已經做了一些搜索,似乎無法找到一個這樣的例子。

回答

3

首先創建2周的ViewModels

public class NewViewModel 
{ 
    // list of files with additional data 
    public List<UploadItem> UploadItems { get; set; } 

    public string AnotherPropForView { get; set; } 
} 

public class UploadItem 
{ 
    // your additional data 
    public string CustomProp1 { get; set; } 
    public string CustomProp2 { get; set; } 
    // file 
    public HttpPostedFileBase UpFile { get; set; } 
} 

創建控制器。一個用於顯示空白表單的動作,另一個用於來自視圖的過程數據

public class SomeController : Controller 
{ 
    public ActionResult Create() 
    { 
     NewViewModel model = new NewViewModel 
     { 
     // inicialize list 
     UploadItems = new List<UploadItems> 
     { 
      // inicialize empty objects (if you want to have 2 file fields with additional data) 
      // or inicialize only one object and another fields add by Javascript 
      new UploadItem {}, 
      new UploadItem {}, 
     } 
     } 
     return View(model); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(NewViewModel model) 
    { 
     // if (ModelState.IsValid) etc... 
     foreach (var uploadItem in model.UploadItems) 
     { 
      // work with file and additional data 
      var file = uploadItem.UpFile; 
      var prop1 = uploadItem.CustomProp1; 
      // file.SaveAs("/some/where"); atc ... 
     } 

     // return some view... 
    } 
} 

而創建視圖

@model Path.To.NewViewModel 
@using (Html.BeginForm("Create", "Some", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
@* Print all inicialized upload items *@ 
    @for (int i = 0; i < Model.UploadItems.Count; i++) 
    { 
    @Html.TextBoxFor(model => model.UploadItems[@i].CustomProp1) 
    @Html.TextBoxFor(model => model.UploadItems[@i].CustomProp2) 
    <input type="file" id="UploadItems[@i].UpFile" name="UploadItems[@i].UpFile" /> 
    } 

<button name="Action" type="submit" value="Save" class="btn">Save</button> 
} 

您可以使用JavaScript動態添加Uploaditem形成 - 你必須產生正確的索引名和輸入

+0

感謝您的代碼ID屬性。我有它的工作:D 我留下的唯一問題是在模型中使用DataAnnotations?有任何想法嗎? – Jenki

+0

您可以在ViewModel中使用DataAnnotations。例如在UploadItem類 [Display(Name =「Name for CustomProp1」)] public string CustomProp1 {get;組; } – Krahu