如何将视图输入数据保存到不同的表中?

时间:2018-12-10 05:14:33

标签: asp.net-mvc ef-database-first multi-model-forms

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

就我而言:

  1. 我有用于教师详细信息数据的ASP.NET MVC表单,以及用于教师任职历史的另一个表单(这两个表单是通过脚手架数据库方法自动生成的)
  2. 我想要一个视图Create.cshtml,用户可以在其中输入老师的详细信息和工作经历,并且可以将其保存到自己的表中。因此,我使用元组并遵循(Multiple models in a view)和(Two models in one view in ASP MVC 3)的操作。 结果,我在视图(仅界面)上成功创建了教师详细信息和工作经历。
  3. 但是我不知道如何将输入保存到不同的表(2个表:teacheremploymentHistory)中。现在,当我保存输入时,什么也没有发生。

我想我需要在控制器零件上做一些事情,请给我一些有关如何做的想法。

预先感谢

1 个答案:

答案 0 :(得分: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用作全局过滤器,并且不打算从控制器返回自定义错误(例如,BusinessException或DatabaseException),则不需要try..catch块,否则,您应该将代码包装在try..catch块中。