如何使用ASP.NET MVC将图像名称上载到数据库?
如何使用ASP.NET MVC将图像名称上载到数据库?
我正在尝试在MVC中创建一个电影库,并且我有以下算法:
1. 将图像保存到服务器的特定文件夹中。`Path.Combine(Server.MapPath("~/Images"), Path.GetFileName(archivo.FileName));`
2. 将图像名称保存到数据库中(不是完整路径,只是像Hello.jpg这样)。
3. 在视图中,使用foreach循环,通过输入``来显示它们。
(如果我的算法不好,请纠正我)
这是我的代码:
控制器:
[HttpPost] public ActionResult Peliculas_Agregar(pelicula pelis) { string path=""; HttpPostedFileBase archivo = Request.Files["Imagen"]; if (ModelState.IsValid) { try { if (archivo != null && archivo.ContentLength > 0) { try { path = Path.Combine(Server.MapPath("~/Images"), Path.GetFileName(archivo.FileName)); archivo.SaveAs(path); } catch (Exception ex) { ViewBag.ErrorArchivo = ex; } } Cine.peliculas.Add(pelis); Cine.SaveChanges(); } catch (Exception ex) { ViewBag.Error = ex; } } return View(pelis); }
模型(由Entity Framework生成):
public int id_peli { get; set; } public string titulo { get; set; } public string director { get; set; } public string cast { get; set; } public string descripcion { get; set; } public Nullableduracion { get; set; } public string categoria { get; set; } [DataType(DataType.Upload)] [Display(Name = "Cargar imagen")] public string imagen { get; set; }
视图:
@using (Html.BeginForm("Peliculas_Agregar", "Admin", FormMethod.Post, new { enctype = "multipart/form-data" })) { @Html.AntiForgeryToken() @Html.LabelFor(m => m.titulo, new { htmlAttributes = new { @for = "exampleTittle" } }) @Html.EditorFor(m => m.titulo, new { htmlAttributes = new { @placeholder = "Título", @class = "form-control"} }) }
我的代码工作正常,但我面临的主要问题是,我无法或者不知道如何将图像名称保存到数据库中,因为我无法获取传入参数的图像名称字符串。我只是得到一个名为System.Web.HttpPostedFileWrapper的字符串或类型。我认为这是因为我使用HttpPostedFileBase将图像保存到服务器,但我无法编辑它并只保存图像名称到服务器。无法同时做这两件事。我该如何解决这个问题?
在ASP.NET MVC中如何将图片名称上传到数据库?
问题出现的原因是在上传图片时,需要将图片名称保存到数据库中。解决方法是通过使用View Model来接收表单和文件的数据,然后将View Model的字段映射到实体的字段,再进行数据库操作。
首先,定义一个实体模型Movie,包括Title和FileName两个属性。
public class Movie { public string Title { get; set; } public string FileName { get; set; } }
然后创建一个View Model MovieVM,用于接收表单的值,其中包括Title和Image两个属性,Image属性使用HttpPostedFileBase类型来表示上传的图片文件。
public class MovieVM { public string Title { get; set; } [Display(Name = "Upload Image")] public HttpPostedFileBase Image { get; set; } }
在控制器中的上传操作方法UploadMovie中,接收MovieVM作为参数。如果ModelState.IsValid为true,即表单数据验证通过,则保存文件并将MovieVM中的字段映射到Movie实体中的对应字段,然后将Movie实体添加到数据库并保存更改。
[HttpPost] public ActionResult UploadMovie(MovieVM model) { if (ModelState.IsValid) { // 保存文件 // ... // 将MovieVM字段映射到Movie实体并保存到数据库 Movie movie = new Movie { Title = model.Title, FileName = model.Image.FileName }; db.Movies.Add(movie); db.SaveChanges(); return RedirectToAction("Success"); } return View(model); }
在这个示例中,使用View Model来接收表单的数据,并通过映射将View Model的字段值赋给实体对象的对应字段。通过这种方式,可以灵活地选择需要映射的字段,忽略不需要的字段,并进行字段的转换。保持字段名称的一致性可以方便开发人员进行字段映射操作。
参考链接:
1. [Upload image included in MVC model](https://stackoverflow.com/questions/20446580)
2. [What is ViewModel in MVC?](https://stackoverflow.com/questions/11064316)