首页 文章

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

提问于
浏览
0

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

就我而言:

  • 我有教师详细数据的ASP.NET MVC表格,另一个教师就业历史(这两个是脚手架数据库方法自动生成)

  • 我想要一个视图 Create.cshtml ,其中用户输入教师详细信息和工作历史,这可以保存到他们自己的表中 . 因此,我使用元组并遵循(Multiple models in a view)和(Two models in one view in ASP MVC 3)所做的事情 . 因此,我在视图(Just界面)上成功创建了教师详细信息和工作历史记录 .

  • 但我不知道如何将输入保存到不同的表中(2个表: teacheremploymentHistory ) . 现在,当我保存输入时,没有任何反应 .

我想我需要在控制器部件上做一些事情,请给我一些关于如何做的想法 .

提前致谢

1 回答

  • 0

    首先,欢迎来到StackOverflow!

    你是对的,你应该在控制器部分做一些事情 .

    • 我会为视图创建一个 ViewModel . 通过这样做,您可以以视图中所需的任何方式从数据库中投影数据 . 此外,使用此方法您不会返回完整实体,也许那里有一些敏感信息 . 您也可以从模型验证中获益 . (例如,如果在某些时候你需要从另一个实体添加另一个字段呢?)

    • 我还会为视图模型中的信息创建部分视图,并将该模型传递给局部视图,这样就可以根据需要重新使用视图 .

    • 将数据传递给控制器时,可以传递 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 块中 .

相关问题