2012-01-13 17 views
5

Ecco il mio codice di controllo e anche il mio Vista:caricamento di più immagini nella stessa forma con MVC3

@using (Html.BeginForm("Create", "Product", FormMethod.Post, new { enctype = "multipart/form-data" })) { 
    @Html.ValidationSummary() 

    <div class="form-field"> 
     <p>@Html.LabelFor(m => m.Name)</p> 
     @Html.EditorFor(m => m.Name) 
    </div> 

    <div class="form-field"> 
     <p>@Html.LabelFor(m => m.Description)</p> 
     @Html.EditorFor(m => m.Description) 
    </div> 

    <div class="form-field"> 
     <p>@Html.LabelFor(m => m.UnitPrice)</p> 
     @Html.EditorFor(m => m.UnitPrice) 
    </div> 

    <div class="form-field"> 
     <input type="file" name="image1" /> 
     <input type="file" name="image2" /> 
     <input type="file" name="image3" /> 
    </div> 

    <div class="form-field"> 
     <input type="submit" value="Create" /> 
    </div> 
} 

E nel controller. Non concentrarti sul contenuto del metodo di azione, concentrati solo sul parametro di tipo List<HttpPostedFileBase>. È questo il modo giusto di fare le cose? Allo stato attuale, images è nullo dopo l'invio del modulo.

[HttpPost] 
public ActionResult Create(ProductModel model, List<HttpPostedFileBase> images) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      var newProduct = Mapper.Map<ProductModel, Product>(model); 
      _productRepository.CreateProduct(newProduct); 
      _productRepository.SaveChanges(); 
     } 
     return RedirectToAction("Index"); 
    } 
    catch 
    { 
     return View(model); 
    } 
} 

Se potessi fornire un esempio molto semplice sarebbe fantastico.

+0

Si scopre Avevo solo bisogno di modificare il codice della vista per utilizzare il nome della collezione HttpPostFile. Ora, qual è il protocollo qui, rispondo alla mia stessa domanda? –

+0

Se nessuna delle risposte inviate fornisce la risposta corretta, sì, pubblica la tua risposta e contrassegnala. Se una delle risposte è molto vicina a ciò che volevi, dai a ciò che mancava nel commento o modifica la risposta stessa e contrassegnala. – Maheep

risposta

6

OK, quindi questo è un semplice esempio su come farlo. Il risultato finale:

enter image description here

Il markup HTML è una forma semplice, con un pulsante di invio.

@using (Html.BeginForm("Create", "Product", FormMethod.Post, new { enctype = "multipart/form-data" })) { 
    @Html.ValidationSummary() 

    <div class="form-field"> 
     <p>Select pictures:</p> 
     <div class="upload-container"> 
      <div class="upload"> 
       <input type="file" name="files" id="file1" /> 
       <img src="@Url.Content("~/Public/images/delete.png")" alt="Remove picture." /> 
      </div> 
     </div>   
    </div> 

    <div class="form-field"> 
     <input type="submit" value="Create" /> 
    </div> 
} 

Abbiamo bisogno anche qualche magia jQuery in modo che ogni volta che qualcuno aggiunge un'immagine, li lasciamo anche aggiungere in più, se necessario. Un utente può caricare N immagini.

<script type="text/javascript"> 
    $(document).ready(function() { 
     var currentImage = 1; 
     $("body").on("change", "input[name='files']", function() { 
      var pathToRemoveIcon = "@Url.Content("~/Public/images/delete.png")"; 
      currentImage = currentImage + 1; 
      var htmlToAppend = '<div class="upload"><input type="file" name="files" id="file' + currentImage + '" /><img src="' + pathToRemoveIcon + '" alt="Remove picture." /></div>'; 
      $('.upload-container').append(htmlToAppend); 
     }).on("click", ".upload img", function() { 
      if ($(this).parent().siblings().length > 0) { 
       $(this).parent().remove();  
      } 
     }); 
    }); 
</script> 

Ed infine il codice del controller:

[HttpPost] 
public ActionResult Create(IEnumerable<HttpPostedFileBase> files) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      //Persist the files uploaded. 
     } 
     return RedirectToAction("Index"); 
    } 
    catch 
    { 
     return View(model); 
    } 
} 
+0

sul tuo OP hai il nome, la descrizione e il prezzo unitario. Come hai incorporato quelli nella tua visione e nell'azione del controller insieme alle immagini? – mbowles

+0

Grazie per un semplice modo cross-browser compatibile di farlo! –

Problemi correlati