MVC5 input file avec razor, le binding ne fonctionne pas correctement
Bonjour à tous,
J'ai un modèle nommé Posts avec un champ Photo dans lequel je sauvegarde le chemin où la photo est uploadé.
J'ai un contrôleur avec une action Create et une action Edit, par chacune de ces actions j'ai une vue qui, respectivement, affiche un formulaire pour créer un Posts et un formulaire pour modifier un Posts. Ce formulaire contient un input de type file pour uploader la photo.
Mon problème est le suivant, j'arrive à uploader ma Photo lorsque que je crée un Post, le chemin de la photo est correctement enregistrer dans ma base. Par contre quand je modifie le Post précédemment créé et que je sauvegarde sans modifier la photo, le chemin renvoyé est null et du coup je perd le chemin vers ma photo. Pourtant, dans le html généré, le champ value de mon input file contient bien le chemin de la photo.
Voici mon model :
Code:
1 2
| [DataType(DataType.Upload)]
public string Photo { get; set; } |
Voici mon input dans mon formulaire :
Code:
1 2 3 4 5 6
| <div class="form-group">
@Html.LabelFor(model => model.Photo, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Photo, new { htmlAttributes = new { @class = "form-control", type = "file" }})
@Html.ValidationMessageFor(model => model.Photo, "", new { @class = "text-danger" })
</div> |
Voici le html génénré :
Code:
<input class="form-control text-box single-line" id="Photo" name="Photo" type="file" value="E:\Dev\DecoBlog\Blog\Images\20140201_115225.jpg">
et voici mon action dans mon controleur :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Posts posts)
{
if (ModelState.IsValid)
{
if (Request.Files != null && Request.Files.Count != 0)
{
if (!String.IsNullOrEmpty(Request.Files[0].FileName))
{
var path = Path.Combine(Server.MapPath("~/Images/"), Request.Files[0].FileName);
posts.Photo = path;
Request.Files[0].SaveAs(path);
}
}
db.Entry(posts).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.CategorieId = new SelectList(db.Categories, "Id", "Name", posts.CategorieId);
return View(posts);
} |
Je ne comprend pas pourquoi l'attribut value n'est pas pris en compte, avez-vous une idée ?
Merci d'avance