如何在MVC 5中支持视图模型

时间:2015-04-23 16:09:19

标签: asp.net-mvc entity-framework viewmodel asp.net-mvc-scaffolding

我正在努力开发一个简单的应用程序。 我有三个通过Entity Framework引入的SQL表,并自动创建了模型。 我希望能够在Visual Studio中自动构建创建/详细信息/编辑等视图。当我从一个模型(例如像Name一样)进行脚手架时,我可以自动执行此操作,但在使用视图模型作为源时无法实现。

以下是我的模特

名称

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; }
}

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

接下来我进入这个界面。

enter image description here

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

enter image description here

我已经读过其他答案,如果您使用的是View Model,则需要清除Data上下文类(来自第一个图像),但如果我这样做,Add按钮将被取消激活。我无法进一步发展。 这里有什么想法吗?

3 个答案:

答案 0 :(得分:6)

我打赌原来的海报可能还没有找到答案。但它可以帮助像我这样的寻求者......

发现这篇文章有所帮助。 Link

走路时似乎控制器 - &gt;添加 - &gt;新的脚手架项目 - &gt;带有视图的MVC Controller,使用Entity Framework 对视图模型不起作用。

如果在选择viewmodel时未在上述脚手架进程中提供DataContext类,则MVC脚手架将不允许您继续进行。如您所示,“添加”按钮被禁用。

解决方法是采取两步的方法。

首先使用scaffolding创建控制器操作(控制器 - &gt;添加 - &gt;新的脚手架项目 - &gt;带读/写操作的MVC控制器

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

链接文章详细介绍了相关步骤请看一下。

但是,您仍然需要自己添加代码以使用控制器操作方法中的Entity框架来使用数据库。 (或者您可以选择介绍Busines图层,存储库等。 YMMV )但这有助于避免编写大量代码来创建视图。

PS:我发现使用ASP.Net核心1.1时这种方法对我来说很合适

答案 1 :(得分:2)

我尝试在控制器中使用View Model并得到相同的错误。然后我添加了一个ID Key来解决错误,EF在我的数据库中创建了一个代表View Model的表。有了这个,我得出结论,View Models不了解数据库,只用于View中的演示。在控制器中,我处理了不同实体的数据库操作。

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

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

以下代码就是一个例子。您可以使用映射工具而不是手动键入代码。使用Entity Framework将视图模型分解为要保存的实体。

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


    }

答案 2 :(得分:0)

将数据上下文类保持为空,然后尝试添加视图。它对我有用。另外,将[Key]添加到任何id属性。