Ho il seguente modello:caricare immagine incluso nel modello 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; }
}
vorrei l'utente sia in grado di entrare nei dettagli per la foto poi inviare il modello del controller. La mia azione di controllo è la seguente:
[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);
}
La mia opinione è la seguente:
@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>
}
La vista viene visualizzata ok e permette all'utente di selezionare un file dal loro disco locale e inserire gli altri dettagli del modello . Il mio problema è che sebbene il modello sia pubblicato nel controller ok, i flag Description, Date e IsActive sono popolati ok - i dati dell'immagine sono nulli.
Qualcuno potrebbe per favore farmi sapere cosa devo cambiare in modo che l'array di byte per la foto sia incluso nel modello pubblicato sul controller?
Un'altra grande risposta, grazie a Darin. Creerò un modello di visualizzazione dedicato. Stavo usando un progetto di repository per questa soluzione, ma ho scoperto che l'ulteriore livello di astrazione ha davvero complicato i miei test di unità moq'd. –
Risposta molto bella, grazie! +1 –
non dovrebbe essere questo: 'photo.UploadImages.InputStream.Read' –