问题描述
我有一个 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 的更详细解释。