2012-01-13 14 views
5

Aquí está mi código del controlador y también mi Vista:Carga de múltiples imágenes de la misma forma usando 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> 
} 

Y en el controlador. No se centre en el contenido del método de acción, simplemente concéntrese en el parámetro del tipo List<HttpPostedFileBase>. ¿Es esta la manera correcta de hacer las cosas? Tal como está, images es nulo a partir del envío del formulario.

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

Si pudiera proporcionar un ejemplo muy simple que sería fantástico.

+0

Resulta Sólo tenía que modificar el código de Vista para utilizar el nombre de la colección HttpPostFile. Ahora, ¿qué es el protocolo aquí? ¿Respondo mi propia pregunta? –

+0

Si ninguna de las respuestas publicadas le da una respuesta correcta, sí, publique su propia respuesta y márquela. Si una de las respuestas está muy cerca de lo que quería, entonces dé el punto que falta en el comentario o edite la respuesta y márquela. – Maheep

Respuesta

6

bien, así que esto es un ejemplo sencillo de cómo hacerlo. El resultado final:

enter image description here

el marcado HTML es una forma sencilla, con un botón de envío.

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

También se necesita un poco de la magia de jQuery para que cada vez que alguien añade una imagen, dejamos que también se suman en más según sea necesario. Un usuario puede subir N imágenes.

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

Y, finalmente, el código del controlador:

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

en su OP tenía el nombre, la descripción y el precio por unidad. ¿Cómo incorporaste esos en tu vista y acción del controlador junto con las fotos? – mbowles

+0

¡Gracias por una forma sencilla de hacer esto compatible con varios navegadores! –

Cuestiones relacionadas