0

我是 ASP.NET MVC 初学者,目前我使用 EF 和数据库优先的方法来完成我的工作。一切顺利,每个模型都有其控制器和视图文件。当我想在视图上保存多模型数据时遇到问题。

就我而言:

  1. 我有一个用于教师详细信息数据的 ASP.NET MVC 表单,另一个用于教师就业历史(这两个是从脚手架数据库方法自动生成的)
  2. 我想要一个Create.cshtml用户输入教师详细信息和就业历史的视图,并且可以将其保存到他们自己的表中。因此,我使用元组并遵循(一个视图中的多个模型)和(ASP MVC 3 中的一个视图中的两个模型)所做的。结果,我成功地在一个视图(只是界面)上创建了教师详细信息和就业历史。
  3. 但我不知道如何将输入保存到不同的表中(2 个表:teacheremploymentHistory)。现在,当我保存输入时,什么也没有发生。

我想我需要在控制器部件上做点什么,请给我一些关于如何做的想法。

提前致谢

4

1 回答 1

0

首先,欢迎来到 StackOverflow!

你是对的,你应该在控制器部分做点什么。

  1. 我会ViewModel为视图创建一个。通过这样做,您可以以视图中所需的任何方式从数据库中投影数据。此外,使用这种方法您不会返回完整的实体,也许那里有一些敏感信息。您还可以获得模型验证的好处。(例如,如果在某些时候您需要从另一个实体添加另一个字段怎么办?)
  2. 我还将为视图模型中的信息创建部分视图,并将该模型传递给部分视图,这样可以在需要时重新使用视图。
  3. 将数据传递给控制器​​时,您可以传递ViewModel数据,然后将数据保存在数据库中。

由于您没有提供课程的模型信息,因此我在下面给出了一个示例。无论哪种方式(查看模型或您遵循的元组示例),您都应该更改控制器代码,类似于我在下面写的内容。

public class TeacherViewModel
 {
    //teacher details
    [Required]
    public int TeacherId {get; set;}
    [Required]
    public string TeacherName {get; set;}
    // {...}
    //teacher employment info
    //here you can have a list of information or the last entry in the history, 
    //or what's required to add a new entry
    public string LastWorkPlace {get; set;}
    public DateTime From {get; set;}
    public To {get; set; }
    //{...}
 }


public class TeacherController: Controller
{
     //{...}
     [HttpPost]        
     public ActionResult SaveTeacherInfo(TeacherViewModel model){
          if (ModelState.IsValid) {
              var teacher = new TeacherEntity 
              {
                 TeacherId = model.TeacherId, //if update otherwise leave blank
                 TeacherName = model.TeacherName
                 //{...}
              };
              //your context name here
              _dbContext.Teachers.Add(teacher);
              var teacherEmploymentInfo = new TeacherEmploymentHistory
              {
                 TeacherId = teacher.TeacherId,
                 LastWorkPlace = model.LastWorkPlace,
                 From = model.From,
                 To = model.To
                 //{...}
              };
              _dbContext.TeachersEmploymentInfo.Add(teacherEmploymentInfo);
              _dbContext.SaveChanges();
             //_dbContext.SaveChangesAsync(); if using async await
          }
          return View(model); //return any validation errors from the view model 
          // to the user to fix.
     }
}

如果您使用ErrorHandler作为全局过滤器,try..catch如果您不打算从控制器返回自定义错误(例如 BusinessException 或 DatabaseException),则不需要块,如果没有,您应该将代码包装在一个try..catch块中。

于 2018-12-10T05:50:53.850 回答