【发布时间】:2019-05-09 17:54:04
【问题描述】:
我正在尝试在 MVC 中做一个电影画廊,我有以下算法:
- 将图像保存到服务器的特定文件夹中。
Path.Combine(Server.MapPath("~/Images"), Path.GetFileName(archivo.FileName)); - 并将图像名称保存到数据库。 (不是完整路径,就像 Hello.jpg)。
- 在视图中,只需使用 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