2012-01-13 13 views
5

Oto mój kod kontrolera, a także moim zdaniem:Przesyłam kilka zdjęć w tej samej formie, używając 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> 
} 

iw sterowniku. Nie skupiaj się na zawartości metody akcji, skup się tylko na parametrze typu List<HttpPostedFileBase>. Czy to właściwy sposób robienia rzeczy? Tak jak jest, images ma wartość NULL po przesłaniu formularza.

[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); 
    } 
} 

Jeśli mógłbyś podać bardzo prosty przykład, który byłby fantastyczny.

+0

Okazuje się, ja po prostu potrzebne do modyfikowania widoku kodu do używania nazwy kolekcji HttpPostFile. Jaki jest tutaj protokół, czy odpowiadam na własne pytanie? –

+0

Jeśli żadna z zamieszczonych odpowiedzi nie daje prawidłowej odpowiedzi, należy napisać własną odpowiedź i oznaczyć ją. Jeśli jedna z odpowiedzi jest bardzo zbliżona do tego, co chciałeś, podaj to, czego brakowało w komentarzu, lub edytuj samą odpowiedź i zaznacz ją. – Maheep

Odpowiedz

6

OK, więc jest to prosty przykład, w jaki sposób to zrobić. Wynik końcowy:

enter image description here

Znaczniki HTML jest prosta forma, z przyciskiem przedstawienia.

@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> 
} 

Potrzebujemy również trochę magii jQuery, aby za każdym razem, gdy ktoś dodaje obraz, pozwalamy im również dodawać więcej w razie potrzeby. Użytkownik może przesłać N obrazów.

<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> 

I wreszcie kod kontrolera:

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

na twoim OP masz nazwisko, opis i cenę jednostkową. W jaki sposób uwzględniłeś te elementy w swoim widoku i działania kontrolera wraz ze zdjęciami? – mbowles

+0

Dziękujemy za prostą, kompatybilną z różnymi przeglądarkami metodą! –

Powiązane problemy