我正在使用MVC 5和实体框架6我的模型包含一个必需属性
public class Slider
{
public int id { get; set; }
[NotMapped]
[ValidateFileAttributeForImages(ErrorMessageResourceName = "SliderFileError", ErrorMessageResourceType = typeof(GlobalRes))]
[Display(Name = "SliderFile", ResourceType = typeof(GlobalRes))]
public HttpPostedFileBase File { get; set; }
public string ImagePath { get; set; }
}
我需要删除此必需的数据注释,以便我可以更新或编辑此模型,因为用户可以在编辑中上传图像..所以我发现了这篇文章Disable Required validation attribute under certain circumstances
所以我做了一个ViewModel包含相同的属性但没有必需的。
public class SliderEditViewModel
{
public int id { get; set; }
[NotMapped]
[Display(Name = "SliderFile", ResourceType = typeof(GlobalRes))]
public HttpPostedFileBase File { get; set; }
public string ImagePath { get; set; }
}
在我的行动结果中
public ActionResult EditSliderLayer(SliderEditViewModel slider, string Comand, HttpPostedFileBase File)
{
using (DBContext db = new DBContext())
{
if (ModelState.IsValid)
{
if (Comand == GlobalRes.EditBTN)
{
db.Entry(slider).State = EntityState.Modified;
db.SaveChanges(); <!-- here i got error -->
return View();
}
else if (Comand == GlobalRes.DeleteBTN)
{
}
}
List<Slider> SliderName = db.Slider.ToList();
ViewBag.SliderLayerName = new SelectList(SliderName, "id", "Header");
return View(slider);
}
}
我收到错误
实体类型SliderEditViewModel不是当前上下文模型的一部分。
ValidateFileAttributeForImages
public class ValidateFileAttributeForImages : RequiredAttribute
{
public override bool IsValid(object obj)
{
var file = obj as HttpPostedFileBase;
if (file == null)
{
return false;
}
if (file.ContentLength > 1 * 1024 * 1024)
{
return false;
}
try
{
if (Path.GetExtension(file.FileName) == ".png" || Path.GetExtension(file.FileName) == ".jpg" ||
Path.GetExtension(file.FileName) == ".jpeg" || Path.GetExtension(file.FileName) == ".bmg ")
{
return true;
}
}
catch
{
}
return false;
}
}
答案 0 :(得分:0)
您需要做的是将模型附加到DbContext
:
db.Sliders.Attach(slider);
db.Entry(slider).State = EntityState.Modified;
db.SaveChanges();
假设Slider对象的DbSet
是Sliders。
基于评论,这个答案,这里有额外的信息,因为有数据模型和域模型。
您的Slider
模型表示数据库中的表格,SliderEditViewModel
表示您在View上使用表单。
现在,当用户提交数据时,您获得SliderEditViewModel
实例(变量slider
),但您的DbContext需要Slider实例。
所以,请做以下事情:
Slider dbSlider = new Slider();
dbSlider.Name = slider.Name;
dbSlider.Whatever = slider.Whatever;
....
db.Sliders.Attach(dbSlider);
db.Entry(dbSlider).State = EntityState.Modified;
db.SaveChanges();