2016-08-19 2 views
0

Bilddateidaten fallen nicht in meinen Controller. Ich sende Dateien mit Typ IEnumerable<HttpPostedFileBase> Dateien.Dateidaten fallen nicht in den Controller

Das ist meine Ansicht

@using (Html.BeginForm(new { @action = "/Upload", @enctype = "multipart/form-data", @method = "POST" })) 
{ 
    <div class="form-horizontal"> 
     <div class="form-group"> 
      <div class="col-md-10"> 
       @Html.Label("Pictures:", new { @class = "control-label col-md-2" }) 
       @Html.TextBoxFor(model => model.files, new { @type = "file", @name = "files", @id = "files", @style = "width: 100%;", @multiple = "multiple" }) 
      </div> 
     </div> 
     <div id="divfiles"></div> 
     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 
<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 
@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
<script> 
    function handleFileSelect(evt) { 
     var files = evt.target.files; 
     var divfiles = document.getElementById('divfiles'); 
     while (divfiles.hasChildNodes()) { 
      divfiles.removeChild(divfiles.lastChild); 
     } 
    for (var i = 0, f; f = files[i]; i++) { 
     if (!f.type.match('image.*')) { 
     continue; 
     } 
     var reader = new FileReader(); 
     reader.onload = (function(theFile) { 
     return function(e) { 
      var span = document.createElement('span'); 
      var imgLoad = document.createElement('img'); 
      imgLoad.setAttribute("id", "imgLoad"); 
      imgLoad.setAttribute("style", "width:10%;"); 
      imgLoad.setAttribute("src", e.target.result); 
      imgLoad.setAttribute("title", escape(theFile.name)); 
      span.appendChild(imgLoad); 
      divfiles.insertBefore(span, null); 
     }; 
     })(f); 
     reader.readAsDataURL(f); 
    } 
    } 
    document.getElementById('files').addEventListener('change', handleFileSelect, false); 
</script> 
} 

Das ist mein Controller

ist hier aren `t meine Bilder kommen

// GET: 
public ActionResult Index() 
{ 
    var rooms = db.Rooms.Include(r => r.Hotel).Include(r => r.RoomType); 
    return View(rooms.ToList()); 
} 

// GET: Rooms/Details/ 
public ActionResult Details(int? id) 
{ 
    if (id == null) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
    Room room = db.Rooms.Find(id); 
    if (room == null) 
    { 
     return HttpNotFound(); 
    } 
    return View(room); 
} 

// GET: Rooms/Create 
public ActionResult Create() 
{ 
    RoomViewModel model = new RoomViewModel(); 
    model.HotelIDs = from c in db.Hotels 
        select new SelectListItem 
        { 
         Text = c.Name, 
         Value = c.Id.ToString() 
        }; 

    model.RoomTypeIDs = from t in db.RoomTypes 
        select new SelectListItem 
        { 
         Text = t.Name, 
         Value = t.Id.ToString() 
        }; 
    model.EquipmentIDs = from k in db.Equipments 
         select new SelectListItem 
         { 
          Text = k.Name, 
          Value = k.Id.ToString() 
         }; 

    //ViewBag.HotelId = new SelectList(db.Hotels, "Id", "Name"); 
    //ViewBag.RoomTypeId = new SelectList(db.RoomTypes, "Id", "Name"); 
    //ViewBag.EquipmentsIds = new MultiSelectList(db.Equipments, "Id", "Name"); 
    return View(model); 
} 
// POST: Rooms/Create 
[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(IEnumerable<HttpPostedFileBase> files, RoomViewModel roomViewModel, int[]EquipmentIDs) 
{ 

Room room = new Room(); 
    room.HotelId = roomViewModel.HotelId; 
    room.RoomTypeId = roomViewModel.RoomTypeId; 
    room.MaxPeople = roomViewModel.MaxPeople; 
    room.WindowView = roomViewModel.WindowView; 
    room.Price = roomViewModel.Price; 
    room.IsDeleted = roomViewModel.IsDeleted; 
    if (EquipmentIDs == null) 
    { 
     foreach (int EquipmentID in EquipmentIDs) 
     { 
      var eqp = db.Equipments.Where(t => t.Id == EquipmentID).FirstOrDefault(); 
      if (eqp != null) 
      { 
       if (room.Equipments == null) 
       { 
        room.Equipments = new List<Equipment>(); 
       } 
       room.Equipments.Add(eqp); 
      } 
     } 
    } 

    //room.RoomsPhotos = roomViewModel.files; 
    if (ModelState.IsValid) 
    { 
     db.Rooms.Add(room); 
     db.SaveChanges(); 
    } 
    return RedirectToAction("Index"); 
} 

[HttpPost] 
public ActionResult Upload(IEnumerable<HttpPostedFileBase> files) 
{ 

    return View("Index", "Hotels"); 

} 

In Verfahren Hochladen von Dateien (IEnumerable-Dateien) kommt nicht.

+0

können Sie Netzwerk-Debug von Chrome-Entwickler-Tools bereitstellen, nur um zu sehen, was in der http-Sitzung ist. Ich denke, ist etwas mit der Bindung und dem Namen des Feldes – hpfs

Antwort

0

[Dies ist nicht eine Antwort, aber ein langer Kommentar und Vorschlag]

Wenn IEnumerable<HttpPostedFileBase> nicht funktioniert, versuchen diese !!!

[HttpPost] 
public ActionResult Upload() 
{ 
    var file = request.files; 
} 
1

Ihr Code erzeugt nicht den richtigen form Tag. Für Datei-Upload zu arbeiten, sollten Sie die enctype Attributwert "multipart/form-data"

Ihre aktuelle Ansicht Code festgelegt haben bilden eine Form Tag wie folgt rendert

<form action="/Upload?enctype=multipart%2Fform-data&amp;method=POST" method="post"> 

</form> 

( die Ansicht Quelltext der Seite überprüfen) aber für den Upload zu arbeiten, idealerweise sollte es sein, wie

<form action="/Upload" enctype="multipart/form-data" method="post"> 

</form> 

Wenn Sie die Html.BeginForm Hilfsmethode verwenden richtig, wird es die richtige Form erzeugen Markup wie oben.

im HomeController ist

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

} 

Angenommen, Ihre Upload Aktionsmethode arbeiten Dies sollte. Wenn es sich um einen anderen Controller handelt, aktualisieren Sie den zweiten Parameter des Aufrufs Html.BeginForm method.