【问题标题】:How to save views input data into different tables?如何将视图输入数据保存到不同的表中?
【发布时间】:2018-12-10 05:14:32
【问题描述】:

我是 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)。现在,当我保存输入时,什么也没有发生。

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

提前致谢

【问题讨论】:

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


    【解决方案1】:

    首先,欢迎来到 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 块中的代码。

    【讨论】:

    • 嗨,首先,非常感谢。我喜欢你友好而清晰的说话哈哈。请给我一些时间来测试你在这里提到的内容。我会尽快回复,希望之后能再次得到您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多