已禁用MVC 5中必需的

时间:2017-02-21 19:34:09

标签: c# asp.net-mvc asp.net-mvc-5 entity-framework-6

我正在使用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;
    }
}

1 个答案:

答案 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();