微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当模型具有外键时,ModelState.IsValid 为 false

如何解决当模型具有外键时,ModelState.IsValid 为 false

我有一个 Machinesettings 实体,这个实体有一个 Machine 实体作为外键。

public class Machine
{
    [Key]
    public int MachineId { get; set; }

    [required]
    [display(Name = "Machine Type")]
    public string MachineName { get; set; }        
}

public class Machinesettings
{        
    [Key]
    public int MachinesettingId { get; set; }

    [required]
    public string Password { get; set; }

    [required]
    public int ReferenceKeyLength { get; set; }

    [required]
    public virtual Machine MachineId { get; set; }
}

在我的控制器类中,当我将 Edit 方法创建为 POST 时:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Machinesettings machinesettings)
{
        if (ModelState.IsValid)
        {
            db.Entry(objapp).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(machinesettings);
}

页面上,我在下拉列表中显示了机器列表,何时进行更改并在下拉列表中选择另一台机器,然后单击保存。使用 Edit 对象调用 Machinesetting 方法。这里我的 ModelState.IsValid 总是错误的。

在调试模式下检查对象时,我从下拉列表中获取 MachineId,但未返回 MachineName,因此如何避免 MachineName 检查此内容以便 { {1}} 属性为真?

解决方法

尝试修复类

DECLARE
   x NUMBER := 100;
BEGIN
   FOR i IN 1..10 LOOP
      IF MOD(i,2) = 0 THEN
         INSERT INTO temp VALUES (i,x,'i is even');
      ELSE
         INSERT INTO temp VALUES (i,'i is odd');
      END IF;
      x := x + 100;
   END LOOP;
   COMMIT;
END;
/              --> this

并为视图创建视图模型

public class MachineSettings
    {        
        [Key]
        public int MachineSettingId { get; set; }

        [Required]
        public string Password { get; set; }

        [Required]
        public int ReferenceKeyLength { get; set; }

        [Required]
        public int? MachineId { get; set; }
      
        public virtual Machine Machine { get; set; }
    }

public class Machine
    {
        [Key]
        public int MachineId { get; set; }

        [Required]
        [Display(Name = "Machine Type")]
        public string MachineName { get; set; } 

         public virtual ICollection<MachineSettings> MachineSettings { get; set; }       
    }

和行动

public class MachineViewModel
{
public MachineSettings  MachineSettings {get; set;}
public IEnumerable<SelectListItem> Machines { get; set; }

}
,

也许你应该为你的 ViewModel 使用一个特定的类。 ViewModels 用于 Views(UI) Controller 互通,并且通常是与持久性 (EF) 层不同的类。因此,您的 ViewModel 甚至不需要完整的 Machine 属性。可能是这样的:

public class MachineSettingsViewModel
{        
    public int MachineSettingId { get; set; } // Only if you are using the ViewModel for edit

    [Required]
    public string Password { get; set; }

    [Compare("Password")]
    public string ConfirmPassword { get; set; }

    [Required]
    public int ReferenceKeyLength { get; set; }

    [Required]
    public int MachineId { get; set; }
  
    public IEnumerable<SelectListItem> Machines { get; set; } // Collection with the options for the machine selector. Must be filled in the controller from query to service or DB
}

ViewModel 可能包含仅在视图中使用的属性,或者表单验证需要但数据库中不需要的属性。

在控制器“获取”操作中,您创建并填充视图模型,然后将视图传递给它,并在“发布”方法中验证视图模型并将其转换为要保存在数据库中的实体。

看看What is ViewModel in MVC?。这是对 ViewModels 与 Models 的更详细解释。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。