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是的,我的意思是当我选择多个第二个图像时,它只上载其中一个。在我的逻辑里