如何在 MVC 5 中搭建视图模型

问题描述 投票:0回答:4

我正在尝试开发一个简单的应用程序。 我通过实体框架引入了三个 SQL 表,并自动创建了模型。 我希望能够在 Visual Studio 中自动构建创建/详细信息/编辑等视图。 当我从单个模型(例如单独的名称)搭建支架时,我可以自动执行此操作,但在使用视图模型作为源时无法到达任何地方。

这是我的模型

姓名

public partial class Name
{
    public Name()
    {
        this.Addresses = new HashSet<Address>();
        this.Emails = new HashSet<Email>();
    }

    public int ID { get; set; }
    public string FIRST_NAME { get; set; }
    public string LAST_NAME { get; set; }

    public virtual ICollection<Address> Addresses { get; set; }
    public virtual ICollection<Email> Emails { get; set; }
}

地址

public partial class Address
{
    public int ADDRESS_ID { get; set; }
    public int NameID { get; set; }
    public string ADDRESS_1 { get; set; }
    public string CITY { get; set; }
    public string STATE { get; set; }
    public string ZIP { get; set; }

    public virtual Name Name { get; set; }
}

电子邮件

public partial class Email
{
    public int EMAIL_ID { get; set; }
    public int NameID { get; set; }
    public string EMAIL { get; set; }

    public virtual Name Name { get; set; }
}

以及我创建的所有三个视图模型

public class MainVM
{
    public Name Name { get; set; }
    public Address Address { get; set; }
    public Email Email { get; set; }
}

我可以完成创建控制器的步骤 - 右键单击控制器>>添加>>控制器>>带有视图的MVC 5控制器,使用实体框架。

接下来我会看到这个屏幕。

enter image description here

如果我单击“添加”,我将收到以下错误。

enter image description here

我在其他答案中读到,如果您使用视图模型,则需要清除数据上下文类(从第一张图像中),但如果我这样做,“添加”按钮将被停用。 我不能再进一步了。 这里有什么想法吗?

asp.net-mvc entity-framework viewmodel asp.net-mvc-scaffolding
4个回答
7
投票

我敢打赌,原来的发帖人此时可能还没有在寻找答案。但它可以帮助像我这样的寻求者..

发现这篇文章有一些帮助。 链接

似乎在采取路线控制器 - >添加 - >新脚手架项目 - >带有视图的MVC控制器时,使用实体框架不适用于视图模型。

如果您在选择视图模型时没有在上述脚手架过程中提供 DataContext 类,MVC 脚手架将不允许您进一步进行。正如您所指出的,“添加”按钮被禁用。

解决方法是采取两步法。

首先使用脚手架创建控制器操作(控制器 -> 添加 -> 新脚手架项 -> 具有读/写操作的 MVC 控制器

然后通过右键单击各个控制器操作方法并利用脚手架来添加视图。 (控制器的操作方法 -> 右键单击 -> 添加视图 -> 模板 -> [选择除空(无模型)之外的任何内容] -> 模型类 -> [在此处选择您的视图模型] -> 将数据上下文类留空 - > 添加按钮现在将启用)。

链接的文章详细介绍了步骤,请查看。

但是,您仍然需要自己添加代码,以便在控制器操作方法中使用实体框架来处理数据库。 (或者您可以选择引入业务层、存储库等。YMMV)但这有助于避免编写大量代码来创建视图。

PS:我发现在使用 ASP.Net core 1.1 时这种方法对我来说效果很好


2
投票

我尝试在控制器中使用视图模型并得到相同的错误。然后,我添加了一个 ID 键来解决该错误,并且 EF 在我的数据库中创建了一个表示视图模型的表。由此我得出的结论是,视图模型不了解有关数据库的任何信息,仅用于在视图中呈现。在控制器中,我处理不同实体的数据库操作。

我必须手动创建一个视图,并在视图中使用 @model myproject.ViewModels.MyViewModel 来表示 Html 助手的视图模型。

这个过程对我有用,我能够将信息保存到每个实体模型的正确数据库表中。

以下代码是一个示例。您可以使用映射工具而不是手动键入代码。使用实体框架将视图模型分解为实体以保存。

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


    }

0
投票

将数据上下文类保留为空,然后尝试添加视图。这对我有用。另外,将

[Key]
添加到任何 id 属性。


0
投票

如果您重命名 DbContext,它会强制您使用,即“NorthWindEntities”为“NorthWindEntities2”(单击类名并执行 CTRL+R),这将清除数据上下文类字段,从而允许您搭建控制器/没有 DbContext 的视图。

这很可能是一个永远无法修复的错误。 设计 UI 的白痴可能从来没有听说过 ViewModel。

上述答案并没有真正提供解决方案,只是一种替代方案。

© www.soinside.com 2019 - 2024. All rights reserved.