2012-04-12 48 views
3

所以我想編錄我的記錄集合。我也想學習一些MVC。所以我決定在MVC中建立一個記錄編目網站。這就是我的工作方式。使用模型綁定在MVC3中上傳多個文件

我只是沾我的腳趾,但無法弄清楚如何將多個文件上傳到我的SQLCE數據庫。我在這裏打開選項 - 將圖像存儲爲BLOBS或簡單地作爲文件名並將圖像上傳到文件系統。

我簡單的模型是這樣的:

public class Record 
{ 
    [ScaffoldColumn(false)] 
    public int RecordId { get; set; } 
    [Required(ErrorMessage = "Artist is required")] 
    public string Artist { get; set; } 
    [Required(ErrorMessage = "Title is required")] 
    public string Title { get; set; } 
    [DisplayName("Release Date")] 
    [DisplayFormat(DataFormatString = "{0:d}")] 
    public DateTime ReleaseDate { get; set; } 
    [Required(ErrorMessage = "Format is required")] 
    public string Format { get; set; } 
    public string Label { get; set; } 
    [DisplayName("Catalogue Number")] 
    public string CatalogueNumber { get; set; } 
    public string Matrix { get; set; } 
    public string Country { get; set; } 
    public IEnumerable<HttpPostedFileBase> Images { get; set; } 
    public string Notes { get; set; } 
} 

我的看法是:

@model Records.Models.Record 
@{ 
    ViewBag.Title = "Create"; 
} 
<h2>Create</h2> 
@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 
<fieldset> 
    <legend>Record</legend> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.Artist) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Artist) 
     @Html.ValidationMessageFor(model => model.Artist) 
    </div> 

    // snipped for brevity 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.Notes) 
    </div> 
    <div class="editor-field"> 
     @Html.TextAreaFor(model => model.Notes) 
     @Html.ValidationMessageFor(model => model.Notes) 
    </div> 
    <div class="editor-field"> 
     <input type="file" name="images" id="image1"/> 
     <input type="file" name="images" id="image2"/> 
     <input type="file" name="images" id="image3"/> 
    </div> 

    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 
} 
<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

和我的創建方法是:

[HttpPost] 
    public ActionResult Create(Record record, IEnumerable<HttpPostedFileBase> images) 
    { 
     if (ModelState.IsValid) 
     { 
      foreach (HttpPostedFileBase image in images) 
      { 
       if (image.ContentLength > 0) 
       { 
        var fileName = Path.GetFileName(image.FileName); 
        var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName); 
        image.SaveAs(path); 
       } 
      } 

      db.Records.Add(record); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(record); 
    } 

但是,圖像(我的Create方法參數)始終爲空,並且Model.IsValid始終爲false。

這是爲什麼?我嘗試命名我的圖像上傳輸入爲'圖像','圖像','圖像[n]'和圖像總是0.

我真的不想使用任何插件,有沒有簡單的本地MVC方式?我向助手開放!

在此先感謝。

+0

你有一個[HTTPGET],它傳回的初步模型的實例?我看到你有[HttpPost]部分。 – 2012-04-12 22:18:19

+0

@Geovani,是的我有一個[HttpGet]方法只顯示視圖。 – Brett 2012-04-16 08:49:26

+0

在HTTPGET中,您是將它返回給記錄的一個實例,還是隻返回View();你能編輯你的問題併發布HTTGET方法的代碼嗎? – 2012-04-17 19:51:27

回答

2

我以前有過這個。這可能是修復。

看起來你缺少視圖中的multipart/form-data@using (Html.BeginForm())

嘗試用 @using (Html.BeginForm("action", "controller", FormMethod.Post, new { enctype = "multipart/form-data" }))

更換@using (Html.BeginForm())顯然與你的替換操作和控制。

希望這有助於〜威爾

編輯:對不起,剛纔看到的發佈日期,如果你沒有帶想通了,那麼也許這是它?

2

一個完美的博客關於本Here

+1

Brilliant post ..感謝分享。 – 2016-03-27 21:36:42