Mam następujący model:Prześlij obraz zawarte w modelu MVC
public class Photo
{
public int PhotoId { get; set; }
public byte[] ImageData { get; set; }
public DateTime DateUploaded { get; set; }
public string Description { get; set; }
public bool IsActive { get; set; }
}
chciałbym użytkownika, aby być w stanie wprowadzić dane na zdjęciu, a następnie opublikować modelowi kontrolera. Moje działanie kontroler jest w następujący sposób:
[HttpPost]
public ActionResult Create(WilhanWebsite.DomainClasses.Photo photo)
{
if (ModelState.IsValid)
{
photo.DateUploaded = DateTime.Now;
_context.Photos.Add(photo);
_context.SaveChanges();
return RedirectToAction("Index");
}
//we only get here if there was a problem
return View(photo);
}
Mój pogląd jest następujący:
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Photo</h4>
<hr />
@Html.ValidationSummary(true)
<div class="form-group">
@Html.LabelFor(model => model.ImageData, new { @class = "control-label col-md-2" })
<div class="col-md-10">
<input type="file" name="uploadImages" class="input-files" />
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.DateUploaded, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.DateUploaded)
@Html.ValidationMessageFor(model => model.DateUploaded)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Description, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Description)
@Html.ValidationMessageFor(model => model.Description)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.IsActive, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.IsActive)
@Html.ValidationMessageFor(model => model.IsActive)
</div>
</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>
}
Widok wyświetlany jest ok i pozwala użytkownikowi wybrać plik z lokalnego dysku i wprowadzić inne szczegóły modelu . Mój problem polega na tym, że mimo iż model jest wysyłany do kontrolera, flagi opisu, daty i IsActive są wypełnione - dane obrazu mają wartość zerową.
Czy ktoś mógłby mi powiedzieć, co muszę zmienić, aby tablica bajtów dla zdjęcia została uwzględniona w modelu wysłanym do kontrolera?
Kolejna wspaniała odpowiedź dzięki Darin. Stworzę dedykowany model widoku. Używałem projektu repozytorium dla tego rozwiązania, ale odkryłem, że dodatkowa warstwa abstrakcji naprawdę skomplikowała moje testy jednostkowe moq'd. –
Bardzo ładna odpowiedź dzięki! +1 –
nie powinno być tym: 'photo.UploadImages.InputStream.Read' –