【问题标题】:How to upload image name to database using ASP.NET MVC?如何使用 ASP.NET MVC 将图像名称上传到数据库?
【发布时间】:2019-05-09 17:54:04
【问题描述】:

我正在尝试在 MVC 中做一个电影画廊,我有以下算法:

  1. 将图像保存到服务器的特定文件夹中。 Path.Combine(Server.MapPath("~/Images"), Path.GetFileName(archivo.FileName));
  2. 并将图像名称保存到数据库。 (不是完整路径,就像 Hello.jpg)。
  3. 在视图中,只需使用 foreach 循环键入 <img src="/Images/@MovieGallery.Imagen"/> 即可显示它们。

(如果我的算法不好请指正)

这是我的代码:

控制器

        [HttpPost]
    public ActionResult Peliculas_Agregar(pelicula pelis)  {

        string path="";
        HttpPostedFileBase archivo = Request.Files["Imagen"]; // @name= file, capturo el name


            if (ModelState.IsValid) { // Validar si son validos los campos segun DBSET
                    try
                    {

                        if (archivo != null && archivo.ContentLength > 0) { //El nombre del archivo debe ser mayor que 0 y no debe ser nulo
                            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);
    }

模型(由实体框架生成)

 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 Nullable<int> duracion { get; set; }
    public string categoria { get; set; }
    [DataType(DataType.Upload)]
    [Display(Name = "Cargar imagen")]
    //[Required(ErrorMessage = "Por favor carga una imagen")]
    public string imagen { get; set; } // here is where i want to save files name, not the path.

查看

@using (Html.BeginForm("Peliculas_Agregar", "Admin", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()
    <div class="Formas">
        <div class="form-group">
            @Html.LabelFor(m => m.titulo, new { htmlAttributes = new { @for = "exampleTittle" } })
            @Html.EditorFor(m => m.titulo, new { htmlAttributes = new { @placeholder = "Título", @class = "form-control"} })
        </div>
        <div class="form-group">
            <input type="file" name="Imagen" />
        </div>
    </div>
    <input type="submit" value="Agregar Película" class="btn btn-outline-primary" />
}

我的代码工作OK,但我面临的主要问题是我不能或我不知道如何将图像名称保存到数据库中因为 我没有得到传入参数的图像的字符串名称。我只是得到一个名为 System.Web.HttpPostedFileWrapper 的字符串或类型: System.Web.HttpPostedFileWrapper

我认为这是因为我正在使用 HttpPostedFileBase 将图像保存到服务器中,但我无法编辑它并将图像名称仅保存到服务器中。不能两样都做。我该如何解决这个问题?

【问题讨论】:

  • 您需要为该字段重新分配值pelis.imagen = archivo.FileName。另请参阅此处的答案stackoverflow.com/a/20446628/2030565。
  • 很高兴你解决了我的问题。哇好简单。也许我压力很大,没有想到这一点。现在我觉得自己像个糟糕的程序员。天哪!现在我必须问这个......,我的算法好吗?
  • 一般步骤可能没问题。但是直接在视图中使用实体模型是一种不好的做法,并且会导致您的原始问题。请参阅链接的答案和What is a ViewModel in MVC。
  • 我应该创建一个单独的 ModelView 并定义每个属性,对吗?如果这是正确的,那么为什么实体框架会生成自动属性?我认为您可以使用它们而不是定义新的。
  • 实体服务于数据库的需求; VM 满足您的视图需求。正如您的文件示例所示,这两者并不总是对齐。

标签: c# asp.net-mvc


【解决方案1】:

根据两个喜欢的答案,我们使用视图模型发布表单和文件。然后我们在执行数据库操作之前将 VM 字段映射到实体的字段。

实体模型

public class Movie
{
    public string Title { get; set; }
    public string FileName { get; set; }
}

创建一个视图模型来捕获您的表单值

public class MovieVM
{
    public string Title { get; set; }

    [Display(Name = "Upload Image")]
    public HttpPostedFileBase Image { get; set; }
}

动作接受 MovieVM 而不是实体

[HttpPost]
public ActionResult UploadMovie(MovieVM model)
{
    if (ModelState.IsValid)
    {
        // save file
        // ...

        // Map to Entity to save to db
        Movie movie = new Movie
        {
            Title = model.Title,
            FileName = model.Image.FileName
        };

        db.Movies.Add(movie);
        db.SaveChanges();

        return RedirectToAction("Success");
    }
    return View(model);
}
  1. Upload image included in MVC model
  2. What is ViewModel in MVC?

【讨论】:

  • 从 MovieVM 声明的属性应该与 Movie 相同?我认为这是因为它们应该匹配在一起?还是我需要一些额外的代码来匹配?
  • 您映射您需要的字段,忽略您不需要的字段,并转换不同的字段。在这里,图像字段需要转换。您可能在数据库记录上有不应发送到视图或从视图发送的审计字段——因此您可以忽略 VM 中的那些。标题字段完美匹配,因此直接映射。匹配名称使开发人员更容易映射字段。
猜你喜欢
  • 1970-01-01
  • 2020-12-10
  • 2013-09-27
  • 2013-04-17
  • 2016-09-07
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
相关资源
最近更新 更多