【问题标题】:How to Load Image on "Edit product" using ASP.NET MVC?如何使用 ASP.NET MVC 在“编辑产品”上加载图像?
【发布时间】:2020-10-29 04:17:05
【问题描述】:

我有一个用于 ASP.NET MVC 中产品的库存 CRUD 模块。在数据库中插入新产品时,我必须为每个产品加载一张图片。

这就是我所拥有的并且效果很好:

我的问题是当我想编辑给定 ID 中的现有产品时,编辑产品时文本成功加载但图像没有。问题是我不知道该怎么做。

这是我的代码:

插入新产品:

@using (Html.BeginForm("NuevoProducto", "Inventario", FormMethod.Post, new { enctype = 
"multipart/form-data" }))
{
    ...
    <div class="form-group">
     <label for="exampleInputFile">Imagen</label>
      <div class="input-group">
       <div class="custom-file">
       <input type="file" id="file" name="Image" class="custom-file-input" multiple onchange="GetFileSize()" />
         <label class="custom-file-label" for="exampleInputFile">Elija Imagen</label>

       </div>
        </div>
         @Html.ValidationMessageFor(m => m.Image, "", new { @class = "text-danger" })

          <div class="col-2">
     <p>Tamaño de Imagen</p>
     </div>
    </div>

}


[HttpPost]
    public ActionResult NuevoProducto(ProductoViewModel viewModel)
    {

        string path = "";
        HttpPostedFileBase archivo = Request.Files["Image"];

        if (ModelState.IsValid)
        {

            if (archivo != null && archivo.ContentLength > 0)
            {
                path = Path.Combine(Server.MapPath("~/Images"), Path.GetFileName(archivo.FileName));
                archivo.SaveAs(path);

            }

            if (ModelState.IsValid) 
            { 
            var producto = viewModel.Producto;
            producto.FechaCreacion = DateTime.Now;
            producto.Estado = true;
            producto.Imagen = viewModel.Image.FileName;
            _productosRepository.Add(producto);
            TempData["Message"] = "¡El Producto se ha INSERTADO con éxito!";
            return RedirectToAction("Productos");
            }
        }

        viewModel.Iniciar(_productosRepository);
        return View(viewModel);

    }

public class ProductoViewModel
{

    public Producto Producto { get; set; } = new Producto();

    [Required(ErrorMessage = "*Se necesita una imagen.")]
    public HttpPostedFileBase Image { get; set; }

}

这是我编辑产品的代码,但图片无法加载:

public ActionResult ModificarProducto(int? id)
    {

        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

        var producto = _productosRepository.Get((int)id, incluideRelatedEntities: false);

        if (producto == null)
        {
            return HttpNotFound();
        }

        //necesito capturar los  datos y almacenarlos en viewmodel
        var viewModel = new ProductoEditViewModel()
        {
            Producto = producto
        };
        viewModel.Iniciar(_productosRepository);

        return View(viewModel);

    }

    [HttpPost]
    public ActionResult ModificarProducto(ProductoEditViewModel viewModel)
    {

        if (ModelState.IsValid)
        {
            var producto = viewModel.Producto;
            _productosRepository.ModificarProducto(producto);
            TempData["Message"] = "¡El Producto se ha MODIFICADO con éxito!";
            return RedirectToAction("DetallesProducto", "Inventario", new {viewModel.Id});

        }

        viewModel.Iniciar(_productosRepository);


        return View(viewModel);
    }

我将存储在图像文件夹中的图像的路径保存在数据库中,并使用 &lt;img src="~/Images/@producto.Imagen" height="100" /&gt;。我不知道如何在编辑视图中加载图像并方便我的客户,因为保存在编辑视图中的图像是空的。

【问题讨论】:

    标签: c# html asp.net-mvc razor


    【解决方案1】:

    单击编辑按钮后,将图像名称和路径存储在 tempdata 中,并在更新期间从 tempdata 中取回。

    【讨论】:

    • 如果用户上传新图片并替换现有加载的图片怎么办?它会起作用吗?
    • 我正在使用HttpPostedFileBase
    • 请分享您的视图显示所有数据
    • 检查您的代码,在您的操作方法 ModificialProducto(int?Id) 中,当您初始化 productoEditViewModel 时,您只是分配回 Product 属性不是 Image 属性。你能检查一下吗??
    • 我知道了,但也许我在加载视图时正在寻找我希望 input file 填充图像路径。我想我必须使用 JS 来编写代码。图片路径我已经有了。
    【解决方案2】:

    在您的编辑表单上添加preview div。下面的例子:

    <div class="custom-file">
       <div class="preview-image-section">
          <img src='@Model.Image' class="preview-image" /> 
       </div>
       <input type="file" id="file" name="Image" class="custom-file-input" multiple onchange="GetFileSize()" />
         <label class="custom-file-label" for="exampleInputFile">Elija Imagen</label>
    
       </div>
    

    在您的 javascript 代码中,如果您想通过选择按钮来显示所选图像:

    function GetFileSize() {
        if (this.files && this.files[0]) {
    
            var FR = new FileReader();
    
            FR.addEventListener("load", function (e) {
                $(".preview-image").attr('src', e.target.result);
            });
    
            FR.readAsDataURL(this.files[0]);
        }
    
       //your code here
     }
    

    【讨论】:

    • 好吧,我觉得我不够具体。您正在尝试显示图像,但我不是我想要的,因为用户需要在 input type=file 中根据需要替换图像
    • 我认为如果我用给定的加载图像路径填充input file 会很好。 (不在绘图时)
    • 按照您的规定,我认为应该在显示之前上传图片。
    猜你喜欢
    • 2020-06-22
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多