C# 在编辑方法中上载多个图像不正确

C# 在编辑方法中上载多个图像不正确,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我有一个编辑方法,可以将主页的一个图像和图库的多个图像上传到数据库中的现有记录中。我有一对多关系表(FurnitureImages在其中存储有关图像的信息),而且我使用视图模型 这是我的密码 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit(FurnitureVM model) { if (model.MainFile != null && model.MainFile.ContentLength

我有一个编辑方法,可以将主页的一个图像和图库的多个图像上传到数据库中的现有记录中。我有一对多关系表(
FurnitureImages
在其中存储有关图像的信息),而且我使用视图模型 这是我的密码

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(FurnitureVM model)
{
    if (model.MainFile != null && model.MainFile.ContentLength > 0)
    {
        string displayName = model.MainFile.FileName;
        string extension = Path.GetExtension(displayName);
        string fileName = string.Format("{0}{1}", Guid.NewGuid(), extension);
        string path = "~/Upload/" + fileName;
        model.MainFile.SaveAs(Server.MapPath( path));
        model.MainImage = new ImageVM() { Path = path, DisplayName = displayName };
    }     
    foreach (HttpPostedFileBase file in model.SecondaryFiles)
    {
        FurnitureImages images = new FurnitureImages();
        if (file != null && file.ContentLength > 0)
        {
            string displayName = file.FileName;
            string extension = Path.GetExtension(displayName);
            string fileName = string.Format("{0}{1}", Guid.NewGuid(), extension);
            var path = "~/Upload/" + fileName;
            file.SaveAs(Server.MapPath(path));
            model.SecondaryImages = new List<ImageVM> { new ImageVM { DisplayName = displayName, Path = path } };
        }
    }
    if (!ModelState.IsValid)
    {
        model.CategoryList = new SelectList(db.Categories, "CategoryId", "Name",model.CategoryId); // repopulate the SelectList
        return View(model);
    }

    Furniture furniture = db.Furnitures.Where(x => x.FurnitureId == model.ID).FirstOrDefault();
    FurnitureImages main = furniture.Images.Where(x => x.IsMainImage).FirstOrDefault();
    furniture.Name = model.Name;
    furniture.Description = model.Description;
    furniture.Manufacturer = model.Manufacturer;
    furniture.Price = model.Price;
    furniture.CategoryId = model.CategoryId;
    furniture.Size = model.Size;       
    main.DisplayName = model.MainImage.DisplayName;
    main.Path = model.MainImage.Path;
    main.IsMainImage = model.MainImage.IsMainImage;
    if (model.MainImage != null && !model.MainImage.Id.HasValue)
    {
        FurnitureImages image = new FurnitureImages
        {
            Path = model.MainImage.Path,
            DisplayName = model.MainImage.DisplayName,
            IsMainImage = true
        };
        furniture.Images.Add(image);
        db.Entry(furniture).State = EntityState.Modified;
    } 
    // Update secondary images
    IEnumerable<ImageVM> newImages = model.SecondaryImages.Where(x => x.Id == null);
    foreach (ImageVM image in newImages)
    {
        FurnitureImages images = new FurnitureImages
        {
            DisplayName = image.DisplayName,
            Path =  image.Path , 
            IsMainImage = false
        };
        furniture.Images.Add(images);
    }
    ViewBag.CategoryId = new SelectList(db.Categories, "CategoryId", "Name", furniture.CategoryId);
    db.SaveChanges();
    return RedirectToAction("Index");
}
[HttpPost]
[ValidateAntiForgeryToken]
公共行动结果编辑(FurnitureVM模型)
{
如果(model.MainFile!=null&&model.MainFile.ContentLength>0)
{
字符串displayName=model.MainFile.FileName;
字符串扩展名=Path.GetExtension(displayName);
字符串文件名=string.Format(“{0}{1}”,Guid.NewGuid(),扩展名);
字符串路径=“~/Upload/”+文件名;
model.MainFile.SaveAs(Server.MapPath(path));
model.MainImage=newImageVM(){Path=Path,DisplayName=DisplayName};
}     
foreach(model.secondary文件中的HttpPostedFileBase文件)
{
FurnitureImages=新的FurnitureImages();
如果(file!=null&&file.ContentLength>0)
{
字符串displayName=file.FileName;
字符串扩展名=Path.GetExtension(displayName);
字符串文件名=string.Format(“{0}{1}”,Guid.NewGuid(),扩展名);
var path=“~/Upload/”+文件名;
file.SaveAs(Server.MapPath(path));
model.SecondaryImages=新列表{new ImageVM{DisplayName=DisplayName,Path=Path}};
}
}
如果(!ModelState.IsValid)
{
model.CategoryList=新建选择列表(db.Categories,“CategoryId”,“Name”,model.CategoryId);//重新填充选择列表
返回视图(模型);
}
Furniture=db.Furnitures.Where(x=>x.FurnitureId==model.ID).FirstOrDefault();
FurnitureImages main=furniture.Images.Where(x=>x.IsMainImage).FirstOrDefault();
furniture.Name=model.Name;
furniture.Description=model.Description;
家具.制造商=型号.制造商;
家具.价格=型号.价格;
furniture.CategoryId=model.CategoryId;
家具.尺寸=型号.尺寸;
main.DisplayName=model.MainImage.DisplayName;
main.Path=model.MainImage.Path;
main.IsMainImage=model.MainImage.IsMainImage;
if(model.MainImage!=null&&!model.MainImage.Id.HasValue)
{
家具图像=新家具图像
{
Path=model.MainImage.Path,
DisplayName=model.MainImage.DisplayName,
IsMainImage=true
};
家具。图像。添加(图像);
db.Entry(furniture).State=EntityState.Modified;
} 
//更新次映像
IEnumerable newImages=model.SecondaryImages.Where(x=>x.Id==null);
foreach(新图像中的ImageVM图像)
{
FurnitureImages=新的FurnitureImages
{
DisplayName=image.DisplayName,
Path=image.Path,
IsMainImage=false
};
家具。图像。添加(图像);
}
ViewBag.CategoryId=新的选择列表(db.Categories,“CategoryId”,“Name”,furniture.CategoryId);
db.SaveChanges();
返回操作(“索引”);
}
主图像上传很好,但当我尝试从另一个输入文件上传多个图像时

@Html.TextBoxFor(m => m.SecondaryFiles, new { type = "file", multiple = "multiple" , name = "SecondaryFiles" })
@Html.ValidationMessageFor(m => m.SecondaryFiles)
@for (int i = 0; i < Model.SecondaryImages.Count; i++)
{
    @Html.HiddenFor(m => m.SecondaryImages[i].Id)
    @Html.HiddenFor(m => m.SecondaryImages[i].Path)
    @Html.HiddenFor(m => m.SecondaryImages[i].DisplayName)
    <img src="@Url.Content(Model.SecondaryImages[i].Path)" />
}
@Html.TextBoxFor(m=>m.SecondaryFiles,新的{type=“file”,multiple=“multiple”,name=“SecondaryFiles”})
@Html.ValidationMessageFor(m=>m.secondary文件)
@对于(int i=0;im.SecondaryImages[i].Id)
@Html.HiddenFor(m=>m.SecondaryImages[i].Path)
@Html.HiddenFor(m=>m.SecondaryImages[i].DisplayName)
}

它只上载一个图像,尽管我一直试图上载多个图像,但它总是只上载一个,因此我的方法中的错误在哪里?

您的问题是,在第一个
foreach
循环中,您正确地将每个文件保存到服务器,但在每次迭代中,创建一个新的
列表
并覆盖
SecondaryImages
的值,这样循环完成后,它只包含一个项目(基于最后一个图像)

将循环更改为

foreach (HttpPostedFileBase file in model.SecondaryFiles)
{
    // FurnitureImages images = new FurnitureImages(); -- DELETE
    if (file != null && file.ContentLength > 0)
    {
        string displayName = file.FileName;
        string extension = Path.GetExtension(displayName);
        string fileName = string.Format("{0}{1}", Guid.NewGuid(), extension);
        var path = "~/Upload/" + fileName;
        file.SaveAs(Server.MapPath(path));
        // Add a new ImageVM to the collection 
        model.SecondaryImages.Add(new ImageVM { DisplayName = displayName, Path = path });
    }
}
注意,上面假设您的视图模型有一个无参数构造函数,用于初始化
SecondaryImages
。如果没有,则在循环之前添加
model.SecondaryImages=new List

其他一些需要解决的小问题

  • 生成
    SelectList
    的代码应为
    model.CategoryList=新的选择列表(db.Categories,“CategoryId”,“Name”)-选择列表的最后一个参数是
    绑定到模型属性时被忽略,因此它是无意义的
  • 删除
    ViewBag.CategoryId=new SelectList(…)
    代码行。 您的模型已包含
    选择列表的属性(根据
    注1)但在任何情况下,您的重定向,因此添加任何内容到
    
    ViewBag
    毫无意义
  • 移动你的
    db.Entry(家具).State=EntityState.Modified行
    在
    db.SaveChanges()之前立即执行的代码

  • 调用数据库条目(家具).State=EntityState.Modified
    紧跟在db.SaveChanges()之前@StephenMuecke我试过了,出了点问题,只上传了一张图片,当我选择2张或更多的时候,你的意思是当你选择更多的图片时,它只上传一张第二张图片吗?(您指的是上传(将文件保存到磁盘)还是将项目保存到
    FurnitureImages
    表中的数据库?)您的代码还有一些其他问题-但您所指的是由
    model.SecondaryImages=new List{new ImageVM{DisplayName=DisplayName,Path=Path}引起的-您一直在覆盖集合。它需要是
    model.SecondaryImages.Add(newImageVM{…})
    在loop@StephenMuecke是的,我的意思是当我选择多个第二个图像时,它只上载其中一个。在我的逻辑里