【问题标题】:Disabled Required in MVC 5MVC 5 中需要禁用
【发布时间】:2017-07-11 14:36:28
【问题描述】:

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

【问题讨论】:

  • 您需要将视图模型映射到数据模型的实例。并且视图模型中的[NotMapped] 属性没有任何意义(无论如何,视图模型都与 EF 无关 - What is ViewModel in MVC?)。作为旁注,您的属性不正确,建议您阅读this answer

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


【解决方案1】:

你需要做的是将模型附加到DbContext

db.Sliders.Attach(slider);
db.Entry(slider).State = EntityState.Modified;
db.SaveChanges();

假设您的 Slider 对象的 DbSet 是 Sliders。

基于 cmets,这个答案,这里有额外的信息,因为有数据模型和域模型。

您有 Slider 模型,它表示数据库中表中的行,SliderEditViewModel 用于您的视图上的表单。 现在,当用户提交数据时,您将获得 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();

【讨论】:

  • 我试过这个但给我错误 cannot convert from 'M.ViewModel.SliderEditViewModel' to 'M.Models.Slider'
  • 这意味着您使用不同的数据库模型和 MVC 模型,因此您必须从一种转换到另一种。创建 Slider 的新实例并将属性从 SliderEditViewModel 实例复制到其中。然后进行附加,将状态设置为已修改并保存更改。
  • 对不起,我很困惑,你能帮我举个例子吗?
  • 当然。好的,你有Slider 模型,它代表数据库中表中的行,SliderEditViewModel 用于你的视图上的表单。现在,当用户提交数据时,您将获得 SliderEditViewModel 实例(变量 slider),但您的 DbContext 需要 Slider 的实例。因此,请执行以下操作: Slider dbSlider = new Slider(); dbSlider.Name = 滑块.Name; dbSlider.Whatever = slider.Whatever; .... db.Sliders.Attach(dbSlider); db.Entry(dbSlider).State = EntityState.Modified; db.SaveChanges();
  • 再次检查答案。我添加了更多信息,因为它在评论中的格式不是很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 2017-12-24
相关资源
最近更新 更多