Asp.net mvc 如何在MVC5中构建视图模型

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

我正在尝试一个简单的应用程序。 我通过实体框架引入了三个SQL表,并自动创建了模型。 我希望能够在VisualStudio中自动生成创建/详细信息/编辑等视图。当我从单个模型(比如名称)构建支架时,我可以自动完成这项工作,但当使用视图模型作为源时,我却无能为力

这是我的模型

名字

电子邮件

我用这三种方法创建了一个视图模型

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


    }