我有一个实体如下:
class Project{
public int Id {set;get;}
... some other props
public virtual Image Image {set;get;}
}
控制器上的我有以下内容:
[HttpPost]
public ActionResult Edit(Project project, HttpPostedFileBase file1)
{
if (ModelState.IsValid)
{
if (file1 != null)
{
var path = FileUploadHelper.UploadFile(file1, Server.MapPath(ProjectImages));
var image = new Image { ImageName = file1.FileName, Path = path, ContentType = file1.ContentType };
var imageEntity = db.Images.Add(image);
db.SaveChanges();
project.MainImage = imageEntity;
}
else
{
ModelState.AddModelError("FileEmpty", "You need to upload a file.");
return View(project);
}
db.Entry(project).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(project);
}
问题在于,当我为此记录阅读项目时,我仍然看到旧图像。即:它没有更新给定项目实体的图像。
为什么会这样?
我可以从DB加载项目并为其分配值。但为什么这不起作用?我可以在不从db加载对象的情况下使其工作吗?
答案 0 :(得分:0)
您的项目对象似乎未附加到上下文 试试这个
if (file1 != null)
{
var path = FileUploadHelper.UploadFile(file1, Server.MapPath(ProjectImages));
var image = new Image { ImageName = file1.FileName, Path = path, ContentType = file1.ContentType };
db.Project.Attach(project);
db.Images.Add(image);
project.MainImage = image;
context.Entry(project).State = EntityState.Modified;
db.SaveChanges();
}
在POST方法结束时删除它:
db.Entry(project).State = EntityState.Modified;
db.SaveChanges();
答案 1 :(得分:-2)
ModelState.Remove("MainImage");
ModelState.SetValue("MainImage", imageEntity);
或者
ModelState.Clear();
然后完全重建模型。我知道这听起来很疯狂,但是,在那里,做到了,在这种情况下没有别的办法。
答案 2 :(得分:-2)
在MVC和浏览器中禁用自动缓存,以便每次都可以更新到最新版本。
您可以使用OutputCacheAttribute控制服务器和/或浏览器缓存,以控制控制器中的特定操作或所有操作。
禁用控制器中的所有操作:
[OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)] // will be applied to all actions in MyController, unless those actions override with their own decoration
public class MyController : Controller
{
// ...
}
停用特定操作:
public class MyController : Controller
{
[OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)] // will disable caching for Index only
public ActionResult Index()
{
return View();
}
}