Télécharger l'image incluse dans le modèle MVC
J'ai le modèle suivant:
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; }
}
Je voudrais que l'utilisateur puisse entrer dans les détails de la photo puis après le modèle de la le contrôleur. Mon contrôleur de l'action est comme suit:
[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);
}
Mon point de vue est comme suit:
@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 vue est affiché ok et permet à l'utilisateur de sélectionner un fichier à partir de leur disque local et entrez les autres détails du modèle.
Mon problème est que si le modèle est affiché sur le contrôleur ok, la Description, la Date et l'est actif drapeaux sont peuplées ok - les données de l'Image est nulle.
Quelqu'un pourrait s'il vous plaît laissez-moi savoir ce que j'ai besoin de changement, de sorte que le tableau d'octets pour la photo est inclus dans le modèle affiché sur le contrôleur?
OriginalL'auteur Rob Bowman | 2013-12-07
Vous devez vous connecter pour publier un commentaire.
Le fichier d'entrée, à votre avis, a un nom
uploadImages
. Je ne peux pas voir une propriété de ce nom dans votre modèle de vue. Vous semblez avoir quelquesImageData
propriété qui est un tableau d'octets, mais il ne semble pas être un champ de saisie avec ce nom dans votre vue.C'est ce qui explique pourquoi vous obtenez la valeur null. Vous pouvez faire ce travail par le respect de la convention. Ainsi, par exemple, si vous avez l'intention d'avoir un champ de saisie de votre point de vue:
alors assurez-vous que vous avez une propriété sur votre modèle de vue avec le même nom. Et bien sûr, de type
HttpPostedFileBase
.Également à votre avis, assurez-vous que vous définissez le bon type de contenu de
multipart/form-data
:Probablement, vous pouvez aller à travers les
blog suivant
afin de mieux vous familiariser avec les bases de téléchargement de fichiers de travail dans ASP.NET MVC. J'ai aussi écrit unsimilaire réponse ici
que vous pouvez consulter.Donc, une fois que vous ajoutez le
HttpPostedFileBase
propriété avec laUploadImages
nom de votre modèle d'affichage vous pouvez alors adapter les actions de votre contrôleur de lire le tableau d'octets et de le stocker votreImageData
propriété:Maintenant garder à l'esprit que ce n'est absolument horrible solution. Ne jamais faire que dans une application réelle. Dans un correctement conçu application, vous aurez un modèle de vue que votre contrôleur de l'action prendra comme paramètre. Vous n'êtes jamais vas utiliser directement votre générée automatiquement EF modèle en tant que paramètre à votre contrôleur de l'action. Vous aurez un modèle de vue avec le
HttpPostedFileBase
de la propriété qui sera associée à votre modèle de domaine.Donc dans un plan bien conçu application, vous aurez un
PhotoViewModel
modèle de vue de classe que votre contrôleur de l'action à prendre.Très belle réponse merci! +1
ne devrait pas être présent:
photo.UploadImages.InputStream.Read
OriginalL'auteur Darin Dimitrov
Modifier cette ligne:
:
Puis changement:
:
Ensuite modifier cette ligne:
:
Enfin, utiliser un code comme ceci à la lecture de l'image dans un tableau d'octets:
OriginalL'auteur acfrancis
Vue:
Contrôleur:
OriginalL'auteur joe