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

9

我想制作一个简单的应用程序,其中涉及IT技术。 我通过Entity Framework引入了三个SQL表,并自动创建了模型。 我希望能够在Visual Studio中自动地生成Create/Details/Edit等视图。当我从单个模型(例如只有Name)进行脚手架时,我可以自动完成此操作,但是使用View Model作为源时却无法做到。

这是我的模型:

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

以及我创建的包含这三个内容的 视图模型(View Model)

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

我可以指导您创建控制器: 右键单击“Controllers” >> “Add” >> “Controller” >> “MVC 5 Controller with views, using Entity Framework”。 接下来,我会看到如下屏幕。 如果我点击“Add”,就会出现以下错误。 我已经在其他答案中阅读到,如果您使用视图模型,则需要清除第一个图像中的数据上下文类,但是如果我这样做,添加按钮将变为无效。 我不能再走得更远了。 有什么建议吗?

我认为你不能这样脚手架。向导希望你选择实体模型,而你却提供了视图模型。 - DavidG
1
我想这可能是不可能的,但当您选择模型类时,视图模型确实会出现在选择列表中。 如果您真的无法做到这一点,我希望有人能够确认它,否则,我非常感激一个解决方案。 - madvora
3个回答

7
我打赌原作者现在可能已经不再寻找答案,但这可以帮助像我一样的求职者。
发现这篇文章可能会有所帮助。链接 看起来,使用视图模型时,通过 控制器 -> 添加 -> 新脚手架项目 -> 使用实体框架的MVC控制器和视图 这条路线并不起作用。
如果在上述脚手架过程中未提供 DataContext 类而选择了您的 ViewModel,MVC 脚手架将不允许您进一步进行。就像你指出的那样,“添加”按钮是禁用的。
解决方法是采取两个步骤。
首先使用脚手架创建控制器操作(控制器 -> 添加 -> 新脚手架项目 -> MVC 控制器,具有读/写操作)。
然后通过右键单击各个控制器操作方法并利用脚手架添加视图。(控制器的操作方法->右键单击->添加视图->模板->[选择除了空模型之外的任何内容]->模型类->[在此处选择您的视图模型]->保留数据上下文类为空->添加按钮现在将启用)。
请参阅链接的文章以获取详细步骤。
但是,在控制器动作方法中仍需要添加代码来使用Entity Framework与数据库交互。(或者您可以选择引入业务层、存储库等。YMMV) 但这有助于避免编写大量创建视图的代码。
PS:我发现这种方法在使用ASP.Net Core 1.1时效果非常好。

2
我曾试图在控制器中使用一个视图模型,并得到了相同的错误。我随后添加了一个ID密钥以解决该错误,EF创建了一个表示视图模型的表格用于数据库。因此,我得出结论:视图模型不应知道任何有关数据库的信息,只用于呈现视图。在控制器中,我处理了不同实体的数据库操作。
我需要手动创建一个视图,并在视图中使用"@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();


    }

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接