Asp.net mvc 如何在MVC5中构建视图模型
我正在尝试一个简单的应用程序。 我通过实体框架引入了三个SQL表,并自动创建了模型。 我希望能够在VisualStudio中自动生成创建/详细信息/编辑等视图。当我从单个模型(比如名称)构建支架时,我可以自动完成这项工作,但当使用视图模型作为源时,我却无能为力 这是我的模型 名字 电子邮件 我用这三种方法创建了一个视图模型Asp.net mvc 如何在MVC5中构建视图模型,asp.net-mvc,entity-framework,viewmodel,asp.net-mvc-scaffolding,Asp.net Mvc,Entity Framework,Viewmodel,Asp.net Mvc Scaffolding,我正在尝试一个简单的应用程序。 我通过实体框架引入了三个SQL表,并自动创建了模型。 我希望能够在VisualStudio中自动生成创建/详细信息/编辑等视图。当我从单个模型(比如名称)构建支架时,我可以自动完成这项工作,但当使用视图模型作为源时,我却无能为力 这是我的模型 名字 电子邮件 我用这三种方法创建了一个视图模型 public class MainVM { public Name Name { get; set; } public Address Address { g
public class MainVM
{
public Name Name { get; set; }
public Address Address { get; set; }
public Email Email { get; set; }
}
我可以完成创建控制器的步骤-
右键单击控制器>>添加>>控制器>>MVC 5控制器和视图,使用实体框架
public ActionResult EmployeeDepartment(EmployeeViewModel evm)
{
if(ModelState.IsValid)
{
try
{
Department dept = new Department();
dept.DepartmentName = evm.DepartmentName;
dept.DepartmentNumber = evm.DepartmentNumber;
db.Departments.Add(dept);
db.SaveChanges();
Employee emp = new Employee();
emp.FirstName = evm.FirstName;
emp.LastName = evm.LastName;
emp.Department = dept;
db.Employees.Add(emp);
db.SaveChanges();
return RedirectToAction("Index");
}
catch(Exception ex)
{
//write code for exception
}
}
return View();
}
接下来我进入这个屏幕
如果单击“添加”,我将得到以下错误
我在其他答案中读到,如果使用视图模型,则需要清除数据上下文类(从第一幅图像中),但如果这样做,则“添加”按钮将被禁用。我不能再进一步了。
有什么想法吗?我试图在控制器中使用视图模型,但得到了相同的错误。然后我添加了一个ID键来解决这个错误,EF在我的数据库中创建了一个表示视图模型的表。由此我得出结论,视图模型并不了解数据库的任何信息,只用于视图中的表示。在控制器中,我处理了不同实体的数据库操作 我必须手动创建一个视图,并在视图中使用@model myproject.ViewModels.MyViewModel来表示Html帮助程序的视图模型 这个过程对我很有效,我能够将信息保存到每个实体模型的适当数据库表中 下面的代码是一个示例。您可以使用映射工具,而不是手动键入代码。使用实体框架将viewmodel分解为要保存的实体
public ActionResult EmployeeDepartment(EmployeeViewModel evm)
{
if(ModelState.IsValid)
{
try
{
Department dept = new Department();
dept.DepartmentName = evm.DepartmentName;
dept.DepartmentNumber = evm.DepartmentNumber;
db.Departments.Add(dept);
db.SaveChanges();
Employee emp = new Employee();
emp.FirstName = evm.FirstName;
emp.LastName = evm.LastName;
emp.Department = dept;
db.Employees.Add(emp);
db.SaveChanges();
return RedirectToAction("Index");
}
catch(Exception ex)
{
//write code for exception
}
}
return View();
}
保持数据上下文类为空,然后尝试添加视图。这对我有用。另外,将
[Key]
添加到任何id属性。我打赌原始海报此时可能还没有找到答案。但它可以帮助像我这样的寻求者
我觉得这篇文章有些帮助
似乎在执行路径Controller->Add->New scaffold Item->MVC Controller with view时,使用Entity Framework无法很好地处理视图模型
如果您在选择viewmodel时没有在上述搭建过程中提供DataContext类,MVC搭建将不允许您进一步操作。如您所示,“添加”按钮已禁用
解决办法是采取两步走的方法
首先使用支架创建控制器操作(控制器->添加->新支架项目->具有读/写操作的MVC控制器)
然后通过右键单击各个控制器操作方法并利用脚手架添加视图。(控制器的操作方法->右键单击->添加视图->模板->[选择除空以外的任何内容(无模型)]->模型类->[在此处选择视图模型]>将数据上下文类保留为空->现在将启用添加按钮)
链接文章详细介绍了这些步骤,请看一看
但是,您仍然需要自己添加代码,以便在控制器操作方法中使用实体框架来处理数据库。(或者您可以选择引入业务层、存储库等…YMMV),但这有助于避免编写大量代码来创建视图
PS:我发现在使用ASP.NETCore1.1时,这种方法对我来说很好,我不认为你可以像这样搭建脚手架。向导希望您选择实体模型,并为其提供视图模型。我认为这可能不可能,但在您选择模型类时,视图模型确实会出现在选项列表中。如果你真的不能做到这一点,我希望有人来证实,否则,我真的很感激一个解决方案。
public class MainVM
{
public Name Name { get; set; }
public Address Address { get; set; }
public Email Email { get; set; }
}
public ActionResult EmployeeDepartment(EmployeeViewModel evm)
{
if(ModelState.IsValid)
{
try
{
Department dept = new Department();
dept.DepartmentName = evm.DepartmentName;
dept.DepartmentNumber = evm.DepartmentNumber;
db.Departments.Add(dept);
db.SaveChanges();
Employee emp = new Employee();
emp.FirstName = evm.FirstName;
emp.LastName = evm.LastName;
emp.Department = dept;
db.Employees.Add(emp);
db.SaveChanges();
return RedirectToAction("Index");
}
catch(Exception ex)
{
//write code for exception
}
}
return View();
}